一.测试用的实体类(ClassInvoke.java):
package com.szy.project.entity;
public class ClassInvoke {
private static String name;
public void test(){
System.out.println("Test ---- Class.invoke()!");
}
private String sayHello(String str){
return "hello:"+str;
}
public String getName(){
return name;
}
}
二.反射机制:获得需要实例化的Class,然后再通过Instance(),方法获得示例;
1.通过引用获得Class:
这种方式已经通过new的方式获得了示例,再通过反射的方式去获得示例显得有点多余,不建议使用;
ClassInvoke test = new ClassInvoke();
Class<ClassInvoke> test1 = (Class<ClassInvoke>)test.getClass();
2.通过forName获得示例对象:
注意:forName()方法中的参数是全类名;
Class<ClassInvoke>test1 = (Class<ClassInvoke>)Class.forName("com.szy.project.entity.ClassInvoke");
3.通过.class获得Class:
Class test1 = ClassInvoke.class;
三.获得示例,执行方法:
ClassInvoke test = new ClassInvoke();
Class<ClassInvoke> test1 = (Class<ClassInvoke>)test.getClass();
ClassInvoke test2;
test2 = test1.newInstance();
test2.test();
Class<ClassInvoke>test1 = (Class<ClassInvoke>)Class.forName("com.szy.project.entity.ClassInvoke");
ClassInvoke test2 = test1.newInstance();
test2.test();
Class test1 = ClassInvoke.class;
ClassInvoke test2 = (ClassInvoke)test1.newInstance();
test2.test();
四.访问私有属性:
两种方式:访问静态属性和非静态变量;
访问测试类ClassInvoke.java中非静态属性sayHello():
try {
Class test = Class.forName("com.szy.project.entity.ClassInvoke");
Method method = test.getDeclaredMethod("sayHello", new Class[]{String.class});
Object invoke = (String)method.invoke(test.newInstance(), new Object[]{"szy!"});//访问非静态属性需要获得示例
System.out.println(invoke);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
访问测试测试类中的静态变量name:
try {
Class test = Class.forName("com.szy.project.entity.ClassInvoke");
Field field = test.getDeclaredField("name");
field.setAccessible(true);
field.set(test, "szy");
System.out.println(field.get("name"));
} catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}