反射reflect
在Java中可以称为"神技",类似于开挂般的存在
方法
Filed
格式:
Class c = Class.forName("com.lanou.day5.Cat1");
Object obj = c.newInstance();
Field[] fs = c.getFields();//守规则的访问
Field[] fs = c.getDeclaredFields();//使用特权访问,级别压制
for(Field f : fs) {
System.out.println(f.getType() + " " + f.getName());
}
Method
格式:
Cat1 c = new Cat1();
Class clazz = c.getClass();
Method[] method = clazz.getDeclaredMethods();
for(Method m : method) {
System.out.println("方法名是:" + m.getName());
System.out.println("方法返回值类型:" + m.getReturnType());
System.out.println("方法有多少参数:" + m);
Parameter[] pa = m.getParameters();
for(Parameter p : pa) {
System.out.println(" " + p.getType());
System.out.println(" " + p.getName());
}
}
一些常用的方法和解释
“方法名是:” + m.getName()
“方法返回值类型:” + m.getReturnType()
“方法有多少参数:” + m
调用: .invoke
开挂模式
"开挂"其实就是提高访问权限,不在受私有方法等的限制,
setAccessible开挂的方法:
f.setAccessible(true);
getDeclaredFiled
访问属性时的开挂
getDeclaredMethod
访问方法时的开挂
泛型擦除
+在泛型底层是不关心放进去的值的类型和泛型的类型是否一致;
但是在应用层取值的时候会关系,若类型不一样,则抛出异常;
在反射过程中,会有泛型擦除,类型不一致也可以
+底层将泛型的类型转为Object来实现,
+Java中是伪泛型,编译后的.class文件中没有泛型
+泛型擦除,反射绕过编译器检查