反射是Java中最强大的技术了,但是java反射影响性能
1、获取Class对象的三种方式
1.1 Object ——> getClass();
1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
1.3 通过Class类的静态方法:forName(String className)
public class Student {
private String name;
private Integer age;
private List<String> hobbys;
public Student() {
}
public Student(String name, Integer age, List<String> hobbys) {
this.name = name;
this.age = age;
this.hobbys = hobbys;
}
}
反射创建对象
反射获取构造方法
/*
* 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
*
* 1.获取构造方法:
* 1).批量的方法:
* public Constructor[] getConstructors():所有"公有的"构造方法
public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
* 2).获取单个的方法,并调用:
* public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
* public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
*
* 调用构造方法:
* Constructor-->newInstance(Object... initargs)
*/
反射
当类中方法定义为私有的时候我们不能调用
当变量是私有的时候我们不能获取
但是反射可以,可以通过反射去执行这个私有方法,并且获取私有变量
1 构造方法
测试类
public class Test{
private Integer age;
private String name;
private Integer intTest;
public Test() {
}
public Test(Integer age) {
this.age = age;
}
public Test(Integer age, String name) {
this.age = age;
this.name = name;
}
public Test(String name) {
this.name = name;
}
}
1.1 获取所有的构造方法
1.2 通过反射构造方法创建对象
Constructor declaredConstructor = aClass.getDeclaredConstructor(Integer.class, String.class);
Object newInstance1 = declaredConstructor.newInstance(18, "简素言");
System.out.println(newInstance1);
Constructor declaredConstructor1 = aClass.getDeclaredConstructor(String.class);
declaredConstructor1.setAccessible(true);
Object newInstance2 = declaredConstructor1.newInstance("裴罗嘉");
System.out.println(newInstance2);
1.3 私有化构造方法创建对象
2 方法
私有方法执行,公有方法执行
在Test类中加入两个方法,一个私有,一个公共
getDeclaredMethod方法获取到这个私有方法,第一个参数是方法名,第二个参数是参数类型。然后通过invoke方法执行,invoke需要两个参数一个是类的实例,一个是方法参数。
2.1 获取指定的方法并执行
Method play = aClass.getDeclaredMethod("play", null);
play.invoke(test,null);
Method say = aClass.getDeclaredMethod("say", String.class);
Object stringSay="you are J-Dragon";
say.setAccessible(true);
say.invoke(test,stringSay);
2.2 获取该类所有方法