从《Java反射机制剖析:定义和API》的API我们看到了许多接口和类,我们能够通过这些接口做些什么呢?
从上篇API中我们能看到它能够完成下面的这些功能:
1)获得类
A.运用getClass()(每个class都有此函数)
i.Stringstr=”abc”; ii.Classc1=str.getClass();
B.运用Class.forName()(staticmethod最常被使用)
i.Classc1=Class.forName(“java.lang.String”); ii.Classc2=Class.forName(“java.awt.Button”);
C.运用.class语法
i.Classc1=String.class; ii.Classc2=java.awt.Button.class; iii.Classc4=int.class; iv.Classc5=int[].class;
D.运用TYPE语法(primitivewrapperclasses基本数据类型包装类的TYPE语法)
i.Classc1=Boolean.TYPE;
2)获得属性
以下四个方法可以获得属性,主要参见的是Java.lang.class
Public Field getField
(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段
public Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段
Public Field
getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
public Field[]
getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段
3)获得方法()
以下四个方法可以获得方法,要参见的是Java.lang.class
public Method
getMethod(String name,
… )
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法
public Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法
public Method
getDeclaredMethod(String name,…)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法
public Method[]
getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
4)获取类的构造器
以下四个方法可以获得方法,要参见的是Java.lang.class
public Constructor
getConstructor(Class<?>… )
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法
public Constructor<?>[]
getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法
Public Constructor<T>
getDeclaredConstructor(Class<?>…)
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法
public Constructor<?>[]
getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法
示例代码:
- importjava.lang.reflect.Constructor; publicclassTestConstructor{ /** *@paramargs *@throwsClassNotFoundException *@throwsSecurityException *@throwsNoSuchMethodException */publicstaticvoidmain(String[]args)throwsException{ //TODOAuto-generatedmethodstub ClassclassType=Class.forName(args[0]); ConstructorConstructor=classType.getConstructor(); System.out.println(Constructor.toString()); } }
5)新建类的实例
调用类的Class对象的newInstance方法
- importjava.lang.reflect.Constructor; publicclassTestConstructor{ /** *@paramargs *@throwsClassNotFoundException *@throwsSecurityException *@throwsNoSuchMethodException */publicstaticvoidmain(String[]args)throwsException{ //TODOAuto-generatedmethodstub ClassclassType=Class.forName(args[0]); //ConstructorConstructor=classType.getConstructor(); Objectinst=classType.newInstance(); System.out.println(inst); } }
调用默认Constructor对象的newInstance方法
- importjava.lang.reflect.Constructor; publicclassTestConstructor{ /** *@paramargs *@throwsClassNotFoundException *@throwsSecurityException *@throwsNoSuchMethodException */publicstaticvoidmain(String[]args)throwsException{ //TODOAuto-generatedmethodstub ClassclassType=Class.forName(args[0]); ConstructorConstructor=classType.getConstructor(); Objectinst=Constructor.newInstance(); System.out.println(inst); } }
调用带参数Constructor对象的newInstance方法
- ClassclassType=User.classConstructorconstructor2= classType.getDeclaredConstructor(int.class,String.class); Objectinst=constructor2.newInstance(1,”123″); System.out.println(inst);
相关链接:
Java反射机制剖析:定义和API
你能给的也只有这么多,在这个狭小的圈子里,