JAVA反射调用无参构造、有参构造、普通方法、成员操作
Person类
package demo;
public class Person {
private String id;
private String name;
public Person(){
System.out.println("我是无参构造");
}
private Person(String id){
System.out.println("我是有参私有构造,传入的值为:"+id);
}
public Person(String id,String name){
System.out.println("我是有参公有构造,传入的值为:"+id+","+name);
}
public void create(String name){
System.out.println("我是create方法,参数为:"+name);
}
}
- 测试方法
package demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Hello {
public static void main(String[] args) throws Exception {
// String fieldName = "name" ; //要操作的成员
Class <?> cls = Class.forName("demo.Person") ;
Object obj = cls.newInstance(); //调用无参构造
//调用类成员
Field fieldName = cls.getDeclaredField("name") ;
fieldName.setAccessible(true); //允许访问私有
fieldName.set(obj, "张三") ;
System.out.println(fieldName.get(obj));
//调用公有有参构造
Constructor<?> csr = cls.getConstructor(String.class ,String.class) ; //调用有参构造
Object obj1 = csr.newInstance("123","张三丰") ;
//调用有参构造,私有的有参构造 需要用 getDeclaredConstructor方法
Constructor<?> csr1 = cls.getDeclaredConstructor(String.class) ; //调用私有构造
csr1.setAccessible(true);
Object obj2 = csr1.newInstance("123321") ;
// 第一个参数是方法名称,第二个参数是参数的类型,如果有多个参数,依次填写
Method mth = cls.getMethod("create", String.class);
// 调用方法
mth.invoke(obj, "创造");
//调用普通方法
}
}