这篇文章主要是写一下关于如何用reflect创建操作对象,以及操作各种方法。
一、获取反射对象
(1)获取反射入口
Class<?> preClass=Class.forName("reflect.People");
(2)获取反射对象并转换成你自己所需要的
People p1=(People)pre.newInstance();
//这里p1就是获取的对象
(3)设置对象的属性
p1.setName("张三");
p1.setId(23);
(4)总代码展示
注意:instance默认是Object类型,所以可以将他转换成你所需要的任意类型
通常在拿reflect入口的时候,推荐Class.forName();
//1.获取反射对的实例,并操作对象
public static void Demo1() throws IllegalAccessException, InstantiationException {
Class<?> perClass=null;
//拿入口推荐Class.forName()
try {
perClass=Class.forName("relfect.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//instanse默认是Object类型 将他转换成你所需要的类型
Person per =(Person)perClass.newInstance();
per.setName("张三");
per.setAge(23);
System.out.println(per.getName()+","+per.getAge());
}
二、操作对象的属性
(1)获取入口 Class.forName();
(2)获取对象 .newInstance();
(3)通过.getDaclaredField()获取所需属性,在这里我拿id这个属性
Field idField=perClass.getDeclaredField("id");
//idField相当于id这个属性
(4)因为我的id属性为private ,所有这里我需要暂时打开权限 .setAccessible(true);
idField.setAccessible(true);
(5)将权限打开后,在设置属性 .set(属性的对象,值)
idField.set(per,1);
(6)总结代码
public class d{
public static void main(String[] args){
Class<?> perClass=null;
//拿入口推荐Class.forName()
try {
perClass=Class.forName("relfect.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Person per =(Person)perClass.newInstance();
Field idField=perClass.getDeclaredField("id");
//要访问的事private修饰的id,但是private是私有的
//修改属性访问权限
//使用反射时候 因为访问修饰符造成异常 可以通过 属性/方法.setAccessible()
idField.setAccessible(true);//把权限打开
idField.set(per,1); //之前per.setId(1); setId() 相当于idFiled
System.out.println(per.getId());
}
}
三、操作方法
(1)获取你所需要的方法 .getDeclaredMethod(方法名,参数类型);
Method method =perClass.getDeclaredMethod("privateMethod",null);
(2)因为方法是private所以需要打开权限 用.setAccessible()
method.setAccessible(true);
(3)调用方法用 .invoke(对象,方法的参数)
method.invoke(per,null);
(4)总结代码
//调用无参的方法
Method method=perClass.getDeclaredMethod("privateMethod",null);
method.setAccessible(true);
method.invoke(per,null);//方法的调用通过invoke()方法 per是对象
//调用有参数的方法
Method method2=perClass.getDeclaredMethod("privateMethod2",String.class);
method2.setAccessible(true);
method2.invoke(per,"张三");
四、操作构造方法
无论拿什么方法都是通过反射入口拿的perClass
//获取公共构造方法 .getConstructors()
Constructors<?>[] constructors=perClass.getConstructors();
//获取全部构造方法.getDeclaredConstructors()
Constructor<?>[] constructors=perClass.getDeclaredConstructors();
//获取指定构造方法 .getConstructor(返回值类型.class)
Constructor<?> constructor= perClass.getConstructor(int.class);
//获取指定私有构造方法 .getDeclaredConstructor()
Constructor<?> constructor1=perClass.getDeclaredConstructor(String.class);
五、通过构造方法拿对象
//获取有参的构造方法 .getConstructor(Integer.class) ,并拿对象
Construtors<?> constructor=perClass.getConstructor(Integer.class)
People p1=(People)constructor.newInstance();
//获取无参构造方法 .getConstructor(),并拿对象
Constructor<?> constructor1=perClass.getConstructor();
Person instance=(Person) constructor1.newInstance();
//因为constructor是无参构造 不需要传值里面