2014-07-15
Java反射
工作几年,近期的项目重新使用Java做开发。虽然之前使用Java做过几个系统开发,但是对一些更基础的概念掌握很是模糊。趁着最近项目比较空闲,利用一些时间复习一下Java的基础用法。 Java反射是很多Java框架的基础,通过反射,可以在运行状态获取类的元数据信息,以及执行对象的方法。
-
获取类对象
Class myObjectClass = MyObject.class Class class = Class.forName(className); -
获取类的名称
Class aClass = ... //obtain Class object. String className = aClass.getName(); Class aClass = ... //obtain Class object. String simpleClassName = aClass.getSimpleName(); -
获取限定词
Class aClass = ... //obtain Class object. int modifiers = aClass.getModifiers(); Modifier.isAbstract(int modifiers) Modifier.isFinal(int modifiers) Modifier.isInterface(int modifiers) Modifier.isNative(int modifiers) Modifier.isPrivate(int modifiers) Modifier.isProtected(int modifiers) Modifier.isPublic(int modifiers) Modifier.isStatic(int modifiers) Modifier.isStrict(int modifiers) Modifier.isSynchronized(int modifiers) Modifier.isTransient(int modifiers) Modifier.isVolatile(int modifiers) -
获取包的信息
Class aClass = ... //obtain Class object. Package package = aClass.getPackage(); -
获取父类
Class superclass = aClass.getSuperclass(); -
获取实现的接口
Class aClass = ... //obtain Class object. Class[] interfaces = aClass.getInterfaces(); -
获取构造器
Constructor[] constructors = aClass.getConstructors(); -
获取方法
Method[] method = aClass.getMethods(); -
获取字段
Field[] method = aClass.getFields(); -
获取注解
Annotation[] annotations = aClass.getAnnotations();
如下是一段代码实例:
package com.riwcwt.common;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionTest
{
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, InstantiationException
{
System.out.println("1.从对象获取类的名称");
Printer printer = new Printer();
System.out.println(printer.getClass().getName());
System.out.println("2.动态调用对象的方法");
Method print = printer.getClass().getMethod("print", new Class<?>[0]);
print.invoke(printer);
print = printer.getClass().getMethod("print", new Class<?>[] { String.class });
print.invoke(printer, new String("an empty message"));
System.out.println("3.根据类的实例创建对象");
Class<?> c = Class.forName("com.riwcwt.common.Printer");
Printer anotherPrinter = (Printer) c.newInstance();
anotherPrinter.print();
anotherPrinter = Printer.class.newInstance();
anotherPrinter.print();
System.out.println("4.获取类的构造器,创建对象");
c = Printer.class;
Constructor<?> constructor = c.getConstructor(new Class<?>[] { String.class });
anotherPrinter = (Printer) constructor.newInstance("构造器传入的消息");
anotherPrinter.pringMessage();
}
}
class Printer
{
private String message = null;
public Printer()
{
}
public Printer(String message)
{
this.message = message;
}
public void pringMessage()
{
System.out.println(this.message);
}
public void print()
{
System.out.println("print to the console");
}
public void print(String message)
{
System.out.println(message);
}
}
运行结果:
1.从对象获取类的名称
com.riwcwt.common.Printer
2.动态调用对象的方法
print to the console
an empty message
3.根据类的实例创建对象
print to the console
print to the console
4.获取类的构造器,创建对象
构造器传入的消息