Java反射

  • 2019-04-30
  • 244
  • 0

概述

反射机制是在运行状态中,对于任意一个雷,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java反射机制。要想剖析一个类,必须先要获取到该类的字节码文件对象,而剖析使用的就是class类中的方法,所以先要获取每一个字节码文件对应的class类型的对象。

有三种方法分别对应不同的时期的字节码对象

源码文件阶段

class clazz = class.forName(“包名+类名”);

字节码二阶段

class clazz = Person.class

创建对象阶段

class clazz = p.getClass(); 通过对象反向获取

反射获取无参构造方法并使用

BuffereddReader br = new BufferedReader(new FileReader("config.properties"));
Class clazz = Class.forName(br.readLine);
Fruit f = (Fruit)clazz.newInstance();
Juicer j = new Juicer();
j.run(f);

反射获取带参构造方法并使用

Class类的newInstance()方法是使用该类的无参构造函数创建对象,如果一个类没有无参构造函数,就不能这样创建了,可以调用Class类的getConstructor(String.class, int.class)方法获取一个指定的构造函数再调用Constructor类的newInstance(“zhangsan”, 22)来创建对象

Class clazz = Class.forName("com.husaky.bean.Person");
Constructor c = clazz.getConstructor(String.class, int.class);
Person p = (Person) c.newInstance("张三", 23);
System.out.println(p); // 重写toString()

反射获取成员变量

Class clazz = Class.forName("com.husaky.bean.Person");
Constructor c = clazz.getConstructor(String.class, int.class);
Person p = (Person) c.newInstance("张三", 23);

// Field f = clazz.getField("name");
// f.set(p, "李四");
Field f = clazz.getDeclaredField("name");  // 暴力反射获取privite字段
f.setAccessible(true);  // 去除私有权限
f.set(p, "李四");

反射获取方法并使用

Class clazz = Class.forName("com.husaky.bean.Person");
Constructor c = clazz.getConstructor(String.class, int.class);
Person p = (Person) c.newInstance("张三", 23);

Method m = clazz.getMethod("eat");
m.invoke(p);

Method m2 = clazz.getMethod("eat", int.class); // 有参数eat
m2.invoke(p, 10);

反射越过泛型检查

泛型检查只在编译期有效,在运行期会被擦除

ArrayList<Integer> list = new ArrayList<>();
list.add(11);

Class clazz = Class.forName("java.util.ArrayList);
Method m = clazz.getMethod("add", Object.class);
m.invoke(list, ""abc);
System.out.println(list);

动态代理

本该自己做的事情,请了一个代理对象来做就叫动态代理,其实就是通过反射来生成一个代理。

public interface Student {
    public void login();
    public void submit();
}

public class StudentImp implements Student {
    public void login() {
        System.out.println("登陆");
    }

      public void login() {
        System.out.println("提交");
    }
}

public class MyInvocationHandler implements InvocationHandler {
    private Object target;
    public MyInvocationHandler(Object target) {
       this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) {
        System.out.priintln("权限检验");
        method.invoke(target, args); // 执行被代理对象target的方法
        System.out.println("日志记录");
        return null;
    }

}

StudentImp si = new StudentImp();
si.login();
si.submit();
System.out.println("-------------------------------");

MyInvocationHandler m = new MyInvocationHandler(si);
Student s = (Student)Proxy.newProxyInstance(si.getClass().getClassLoader(), si.getClass.getInstancerfaces(), m);
s.login();
s.submit();

评论

还没有任何评论,你来说两句吧

粤ICP备17155863号

- 友情链接 - Theme by Qzhai