Java反射机制
1.定义:在JVM运行过程中,获取、设置、调用类的成员变量,成员方法的一种动态机制。
2.使用方法
2.1获取Class类
Clasd.forName(String str)
Object.class
Object.getClass(String str)
PS:三中方法获取的Class类是完全一致的。
因为当JVM加载类的时候会生成一个java.lang.class类,一个类只会产生一个字节码文件,所以这三个方法获取的class对象完全一致。
2.2获取构造方法
getConstructor(String str)
获取:public修饰的指定的构造方法
返回值:Constructor
getConstructors()
获取:所有public修饰的构造方法
返回值:Constructor[ ]
getDeclaredConstructor(string str)
获取:获得有參构造器
返回值:Constructor 对象 getDeclaredConstructors()
获取:所有构造器
返回值:Constructor[ ]数组对象
2.3获取成员变量
U)CXK3W2.png)(举个例子)
Class aclass= DemoClass.class;
aclass.getField(String str)
aclass.getFields()
aclass.getDeclared(String str)
aclass.getDeclareds( )
PS:具体区别参考获得构造方法。
2.4获取成员方法
public Method getMethod(String name,Class<?>... parameterTypes) //name获得的方法的方法名
//Class<?>... parameterTypes 获得方法的参数类型的类类型
Method method = aClass.getMethod("test",String.class);// public void test(String s)
getMethods( )
getDeclaredMethod(String str)
getDeclaredMethods( )
PS:.具体用法可以参考获取构造器的方法
区别可以获取public,static,private,
修饰的成员变量或者成员方法
注意获取到的是变量还是数组变量.
3.初始化对象
可以根据获取的无参构造方法,初始化一个类。
Class c=DemoClass.class;
//public DemoClass()无参构造方法
Construct cons=c.getConstructor( );
Object o=c.getInstance( );
通过字节码文件获得Class反射对象,使用Class对象得到public的公共无参构造方法对象类Construct,通过Construct类的
T newInstance(Object … initparameter )方法获得DemoClass对象
3.2 通过有參构造方法创建对象
Class c=DemoClass.class;
//public DemoClass(String name,int id,
float salary);有參构造方法
Construct cons=c.getConstructor( String.class,
Int.class,Float.class);
Object o=c.getInstance(
“程婷”,20,11000f);
可以得到一个被有參构造方法初始化的DemoClass对象.
-
Field类中的set(Object key,Object value) 设置成员变量值;
setAccessible(boolean flag);//设为暴力访问(访问私有或者是默认访问修饰符成员变量)
//1、根据无参构造方法,创建对象o Class<?> bClass = Class.forName("com.xc.pojo.Student"); Constructor<?> constructor1 = bClass.getDeclaredConstructor(); Object obj = constructor1.newInstance(); Field[] declaredFields1 = bClass.getDeclaredFields(); declaredFields1[0].setAccessible(true);//设为暴力访问(访问私有或者是默认访问修饰符成员变量) declaredFields1[1].setAccessible(true); declaredFields1[0].set(o,"小芳"); declaredFields1[1].set(o,20); declaredFields1[2].set(o,"湖南省长沙市"); for (Field f : declaredFields1) { System.err.println(f); }
5、Method中用于执行对象方法的方法public Object invoke(Object arg0,Object… agrs);
Class<?> aClass = Class.forName("com.xc.pojo.Student");
Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, int.class, String.class);
Object o = constructor.newInstance("小程", 20, "五一广场五一新干线");
Method[] methods = aClass.getDeclaredMethods();
for (Method method : methods) {
method.setAccessible(true);
System.err.println(method.invoke(o));
}