Java反射机制
java的反射机制是一种逆向的思维。通常来所,知道一个类,然后new一个对象。而反射便是从一个对象开始,然后反推出它所在的类。前者是抽象到具体的过程。后者是从具体到抽象的过程。
1、类对象Class
- 通过类的实例获得该类的类对象。使用instance#getClass()方法。即通过具体获得类的框架。
1 | Peson p = new Person("xiaoming"); |
通过pClass可以获得Person类中的接口和函数等方法。当获得class类之后和实例的关系就分开了。
- 使用Class#getDeclaredField(“name”)->Field来获得类响应的属性。可以是公有的,也可以是私有的。但是获得的只是一个类的模板,想要获得一个实例的具体属性,就要用模板来加载实例,然后返回实例的值。也可以通过该Field来设置相应的值。
(1)Field#get(instance) 获得instance中对应Field字段的值
(2)Field#set(instance,value) 设置instance中对应Field字段的值
1 | // 获得Field对象,是一个模板,该模板是属性name的模板 |
输出结果:
1 | xiaoming |
2、反射调用函数
- 每个Class类中都含有getMethod的方法。根据该方法返回一个Method的对象。该Mehtod对象便是方法的一个模板,使用Method#invoke(Object obj,Object.. args)来对obj对象执行Method方法。并且传入想要的参数。或者参数类
1 | String s = "Hello World"; |
输出结果
1 | World |
动态代理模式
- 核心函数
Proxy.newProxyInstance(ClassLoader,Interface,handler)
第一个参数:ClassLoader。除了jdk自带的一些类:ClassLoader不用使用之外,随意使用classLoader便可以了。
第二个参数:Interface。需要代理的类的接口,这个决定了所代理的类,以下的参数均通过测试
1、Student.class.getInterfaces()
2、new Class[]{Person.class}
3、student.getClass.getInterfaces()
第三个参数:handler,实现了Invocation的接口,并且实现public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
函数。method.invoke(object,args)必须object必须匹配接口 - 简单实现
接口类:Bird
1 | public interface Bird { |
实现类:Swallow
1 | public class Swallow implements Bird { |
接口类:Person
1 | public interface Person { |
实现类:Student
1 | public class Student implements Person{ |
MyHandler实现InvocationHandler的接口
1 | public class MyHandler implements InvocationHandler{ |
主类,测试
1 | public class Client{ |
输出结果:
1 | com.sun.proxy.$Proxy0 |