1.反射的介绍
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。
可以理解反射就是把java类中的各种成分映射成一个个的Java对象。
2.反射Class对象
//单元测试方法:是java测试的最小单位
//语法要求:@Test + void + 无参的 + public
@Test//获取类对象
public void getClazz() throws ClassNotFoundException {
Class<?> stuendt = Class.forName("day16.Student_");//类的路径
Class<?> stuendt2 = Student_.class;
Class<?> stuendt3 = new Student_().getClass();
System.out.println(stuendt);//反射到Class对象
System.out.println(stuendt2.getName());//获取到类的全路径
System.out.println(stuendt3.getSimpleName());//只获取类名
System.out.println(stuendt3.getPackage().getName());//只获取包名
}
3.反射类中的构造方法
@Test
public void getConstruct(){
Class<?> clazz = Student_.class;
Constructor<?>[] cs = clazz.getConstructors();//获取构造方法们
for (Constructor c:cs){//获取每个构造
System.out.println(c.getName());//获取构造方法的名称
Class[] cc = c.getParameterTypes();//获取构造方法的参数 类型
System.out.println(Arrays.toString(cc));
}
}
4.反射类中的成员方法
@Test
public void getFunction() throws ClassNotFoundException {
Class<?> clazz = Class.forName("day16.Student_");
Method[] ms = clazz.getMethods();//获取成员方法们
for (Method m:ms){
System.out.println(m.getName());
Class<?>[] cc = m.getParameterTypes();
System.out.println(Arrays.toString(cc));
}
}
5.反射类中的成员变量
@Test//成员不能是默认的default,必须被public修饰
public void getFieldd() throws ClassNotFoundException {
Class<?> clazz = Student_.class;
Field[] fs = clazz.getFields();//获取公共的成员变量
for (Field f:fs){
System.out.println(f.getName());
System.out.println(f.getType().getName());//获取变量数据类型
}
}
6.反射创建对象
//反射创建对象
@Test
public void getObject() throws Exception {
Class<?> clazz = Student_.class;
//创建对象
Object obj = clazz.newInstance();//触发无参构造
System.out.println(obj);
//指定你想要触发具体的哪一个含参构造
Constructor<?> c = clazz.getConstructor(String.class,int.class);
Object obj2 = c.newInstance("jack",20);//触发构造方法
System.out.println(obj2);
}
7.暴力反射私有属性
@Test
public void getFiledd() throws Exception {
Class<?> clazz = Person.class;
Field field = clazz.getDeclaredField("name");//获取私有属性
System.out.println(field.getType().getName());//获取属性的数据类型
//设置私有属性的值
Object obj = clazz.newInstance();
field.setAccessible(true);//暴力触发设置私有可见
field.set(obj,"rose");//set(m,n)-m是你要设置值的对象,n是要设置的具体值
System.out.println(field.get(obj));
}
8.暴力反射私有方法
@Test
public void getFunction() throws Exception {
Class<?> clazz = Person.class;
//暴力反射私有方法
//getDeclaredMethod(m,n,o,p...)-m是要执行的方法名-n o p是方法需要的参数
Method method = clazz.getDeclaredMethod("save", int.class, String.class);
Object obj = clazz.newInstance();
method.setAccessible(true);//设置私有方法
method.invoke(obj,10,"xiongda");
}
网友评论