java反射和动态代理

来源:互联网 发布:魔方格软件好用吗 编辑:程序博客网 时间:2024/05/17 22:23

说实话,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");    }}
原创粉丝点击