java之反射
1. Class对象获取方法
1.1 通过Class.forName(“类全限定名”),类的全限定名:类名+包名
1.2 通过Class的属性来获取,className.class
1.3 调用某个对象的getClass()方法
1.4 第一种比第二种的性能更好,不需要调用方法,且更安全,因为在编译期间检查类是否存在,如果是字符串来获得,只能用第一种。
2. 从Class对象中获得有关信息
2.1 ConstructorgetConstructor(Class
2.2 Constructors
2.3 Method getMethod(String methodName,Class…paramType) 返回该class对应的,带指定形参的方法
2.4 Method[] getMethods() 返回所有的public方法
2.5 Filed getFiled(String name) 返回该类所对应的名为name的成员变量
2.6 Filed[] getFileds() 返回public的所有成员变量
2.7 反射可以调用私有的构造函数和方法的,只是这里没有列举
3. 使用反射生成对象
3.1 使用Class的newInstance(),要求是必须有默认构造函数
public Test{
public static void main(String[]args){
Class<Test>cls=Test.class;
cls.newInstance();
}
}
3.2先用Class对象获得Constructor对象,再用constructor对象使用newInstance创建对象
public Test{
private String name;
public Test(String name){
this.name=name;
}
public static void main(String[]args){
Class<Test>cls=Test.class;
Constructor ctor=cls.getConstructor(String,class);
}
}
对于上面两种创建方法,一般采用第一种,因为在javaEE里面,都是用配置文件来创建对象,配置文件大多都是类的全限定名。
4. 动态创建数组
使用Array类,通过 Object Array.newInstance(Class<?>componentType,int length)来进行实例化,同时通过set(Object array,int index,int value)来设置值,通过get(Object,int index)来获取值。案例代码如下:
package javase;
import java.lang.reflect.Array;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
Object obj=Array.newInstance(Integer.class, 2);
Array.set(obj, 0,1);
System.out.println(Array.get(obj, 0));
}
}