反射机制
动态语言,程序运行时可改变程序结构或变量类型Python、ruby。运行时可以动态的改变结构。利用反射机制,可以让java获得动态特性。
1 什么是反射
- 反射指得是可以与运行时加载、探知、使用编译时完全未知的类。
- Class c = Class.firName("com.User")
- 在加载类之后,在堆内存中,就产生了一个Class类型的对象。
//测试java.lang.Class对象的获取方式
public class Test01{
public static void main(String[] args){
//一个类被加载后,JVM会创建一个对应该类的Class对象。类的整个信息会被放到对应的Class的对象中。
//同一个类指挥加载一次。
//class interface annotation enm,type ,void bb
Class clz = Class.forName(path);
// getClass();对象.getClass()
//String.class;
int [] arr1 = new int[10];
int [] arr2 = new int[20];
arr1.getclass().hashCode()==arr2.getclass().hashCode();
}
}
2 应用反射API获取类的信息
//测试java.lang.Class对象的获取方式
public class Test02{
public static void main(String[] args){
//一个类被加载后,JVM会创建一个对应该类的Class对象。类的整个信息会被放到对应的Class的对象中。
//同一个类指挥加载一次。
//class interface annotation nm,type ,void
Class clz = Class.forName(path);
// getClass();对象.getClass()
//String.class;
clz.getNmae();//获得名字
clz.getSimpleName();
//获得属性。将Field换成Method可以获得方法
Field f = clz.getField(String name);//
Field[] f = clz.getFields();//只能获得Public的field;
Method m01 = clz.getDeclaredMethod("getUname",null);
Method m01 = clz.getDeclaredMethod("getUname",String);//加上参数类型。防止重载
Field[] f = clz.gerDeclaredFields();//获得所有field
Constructor[] constructors = clz.getDeclardConstructors();
Constructor constructor = clz.getDeclardConstructor(null );
Constructor<User> c= clz.getDeclaredConstructor(int.class,int.class,String.class);
User u2 = c.newInstance(1,2,"sd");
//通过API调用构造方法,调用的是无参构造方法
User u = clz.newInstance();
//通过反射调用普通方法
Method method = clz.getDeclaredMethod("setUname",String,class);
method.invoke(u,"参数");
//通过API操作属性
Field f = clz.getDeclaredField("uname");
f.set(u,value);//不能访问私有属性。
f.setAccessible(true);
f.set(u,value);//能访问私有属性。
}
}
3 反射机制性能
- setAccessible
- 为true时反射对象在使用时取消Java语言的访问检查。职位false应该做java语言访问检查。
- 禁用安全检查,可以提高反射的运行速度。但安全性会降低
4 反射操作泛型
- java采用泛型擦除机制,java新增了ParameterizedType,几种类型来代表不能被归一到class类中的类型。但又于原始类相同的类
getGenericParameterTypes();//获得参数信息
getGenericReturnType();//获得返回信息
5 反射操作注解
//获得类注解
Annotation[] annotation = clz.getAnnotations();
Table st = (Table)clz.getAnnotation(Table.class);
Filed f= clz.getDeclaredFiled("studentName");
Filed1 filed1 = f.getAnnotation(Filed1.class);
网友评论