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");
posted @ 2016-08-09 12:57  zhangshihai1232  阅读(148)  评论(1)    收藏  举报