java反射
反射的类
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
一. 获取类的方法
方法1:Class类的forName方法
Classc1 = Class.forName("Employee");  
方法2:class属性
Classc2 = Employee.class;  	//jvm自动生成的
方法3:getClass方法,Object的native方法
Employeee = new Employee();  
Classc3 = e.getClass();
二. 创建对象
空参构造函数
如果有空参构造,可以直接构造;
如果没有空参构造函数,会报错;
Class c =Class.forName("Employee");  
Object obj = c.newInstance();
获取指定构造函数
Constructor constructor = c.getConstructor(String.class, String.class, Integer.class);
Object obj2 = constructor.newInstance("小明", "1234", 10);
System.out.println(obj);
三. 获取属性
获取公共属性getFields
	Class c = Class.forName("reflact.Employee");
    Field[] fs2 = c.getFields();
    for (Field f : fs2) {
        System.out.println(f);
    }
获取全部属性getDeclaredFields
	Class c = Class.forName("reflact.Employee");
    Field[] fs = c.getDeclaredFields();
    for (Field f : fs) {
        System.out.println(f);
    }
然而,这两个方法貌似没什么用处
获取具体的属性使用getField和getDeclaredField,使用getDeclaredField虽然能够获取所有的属性,
但是私有属性获取值会抛异常,需要调用获取到的field的setAccessible方法,打破破封装性才能访问
    Class c = Class.forName("reflact.Employee");
    Constructor constructor = c.getConstructor(String.class, String.class, Integer.class);
    Object obj = constructor.newInstance("小明", "1234", 12);
    Field field = c.getDeclaredField("name");
	field.setAccessible(true);
    System.out.println(field.get(obj));
四. 获取方法
getMethods获取公有方法,包括父类;
getDeclaredMethods仅获取本类,但是获取全部方法;
获取并调用,需要获取具体的方法,使用getMethod或者getDeclaredMethod
    Class c = Class.forName("reflact.Employee");
    Method method = c.getDeclaredMethod("privateSpeak",String.class);
    method.setAccessible(true);
    method.invoke(obj,"etst");
使用私有方法同样需要调用method的setAccessible方法,使用时需要传入构造好的这个类的实例
	Constructor constructor = c.getConstructor(String.class, String.class, Integer.class);
	method.invoke(obj,"etst");
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号