说实话,java反射是我刚搞懂的,搞了一年的java,连个java反射都不会,感觉愧对丹尼斯里奇祖师爷。
好了,废话不多说了,说说自己的见解。
反射,不仅在java中有,c#中也是有java机制的,反射的作用是让你自己你自己所有的属性,方法和构造器。而反射主要用于框架中,就是我们import导入了框架中的类,但是该类的属性,方法是通过反射知道的,总结来说,导入类之后,我知道了自己有几斤几两,知道我自己有什么属性,方法,那么我就可以用我的这些属性和方法。
动态代理是在代理的基础上衍生的更高级的代理,而动态代理也是主要用于框架,其原理就是:
我想要调用某个类,但是我不直接去调用,而是交给一个中间代理的类,让他帮我去调用,其效果和直接调用是一样的,只不过,这样的设计是不是减小了耦合呢?!
而说的动态代理,其实就是在原来写死的代理基础上,让他可以通过参数动态改变的。
网上看到一个特别好的例子:
这是想要被调用的类:
public interface Interface {
void doSomething();
void somethingElse(String arg);
}
public class RealObject implements Interface {
public void doSomething() {
System.out.println("doSomething.");
}
public void somethingElse(String arg) {
System.out.println("somethingElse " + arg);
}
}
这是代理方法:
public class DynamicProxyHandler implements InvocationHandler {
private Object proxyed;
public DynamicProxyHandler(Object proxyed) {
this.proxyed = proxyed;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
System.out.println("代理工作了.");
return method.invoke(proxyed, args);
}
}
这是测试类:
public class Main {
public static void main(String[] args) {
RealObject real = new RealObject();
Interface proxy = (Interface) Proxy.newProxyInstance(
Interface.class.getClassLoader(), new Class[] {Interface.class},
new DynamicProxyHandler(real));
proxy.doSomething();
proxy.somethingElse("luoxn28");
}
}