- 反射机制是什么?
- 反射机制是把Java的类的组成部分封装成类对象。
- Java代码编译后会生成字节码.class,字节码被类加载器封装成Class对象,其中变量封装成Field[],构造器封装成Constructor[],方法封装成Method[]。
- 利用反射可以调用类或对象,比如获取类定义,调用类变量、构造对象和方法,甚至可以运行时修改类定义
- 如何利用反射机制获取Class对象
- Class.forName("全类名(包名.类名)")
- 将字节码加载进内存
- 多用于配置文件:读取文件时加载类
- ClassName.class
- ClassName.getClass()
- 动态代理的实现
- 实现InvokationHandler进行前置操作,然后用Proxy以调用目标为接口作为代理实例,以代理对象间接调用目标的逻辑。
- 例子:
public class MyDynamicProxy {
public static void main (String[] args) {
HelloImpl hello = new HelloImpl();
MyInvocationHandler handler = new MyInvocationHandler(hello);
// 构造代码实例
Hello proxyHello = (Hello) Proxy.newProxyInstance(HelloImpl.class.getClassLoader(), HelloImpl.class.getInterfaces(), handler);
// 调用代理方法
proxyHello.sayHello();
}
}
interface Hello {
void sayHello();
}
class HelloImpl implements Hello {
@Override
public void sayHello() {
System.out.println("Hello World");
}
}
class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("Invoking sayHello");
Object result = method.invoke(target, args);
return result;
}
}