首页 > 编程语言 > 详细

Java反射

时间:2019-10-22 17:23:51      阅读:91      评论:0      收藏:0      [点我收藏+]

java反射中的Proxy类的方法getProxyClass中的一个参数,我们可以看到源码如下

package java.lang.reflect;

public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

该方法中的参数proxy是生成的代理类对象,method是被代理类的某个方法,args是在该method中的参数。业务增强就是在这里

一个次动态代理的组成,一个接口,一个实现类,一个动态代理类。这个动态代理类是生成的,并且该类继承了Proxy并实现了接口。因为已经继承了Proxy所以被代理类一定需要一个接口,而不能是个抽象类。这个接口存在是为了提供给动态生成的代理类,需要实现哪些方法,方法的修饰符和参数类型都是什么。

一个完整的例子如下。

package com.easyjdbc.proxyobtain;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Dao {
    void save(String name);
    void put();
}

class DaoImpl implements Dao {
    @Override
    public void save(String name) {
        System.out.println("save..."+name);
    }

    @Override
    public void put() {
        System.out.println("put");
    }
}

public class DynamicProxyTest {

    public static void main(String[] args) throws Exception {

        Object target = new DaoImpl();
        
        Class<?> proxyClass = Proxy.getProxyClass(DaoImpl.class.getClassLoader(), DaoImpl.class.getInterfaces());
        InvocationHandler handler = new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object result = null;
                System.out.println("before...");
                result = method.invoke(target, args);
                System.out.println("after...");
                return result;
            }
        };
        Dao userDao = (Dao) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);
        userDao.save("123");
    }
}

其中最为重要的方法就是public static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) throws IllegalArgumentException。可以进去看到于源码有安全检查和数据

技术分享图片

 接着点进入,注意这里都是点方法,不是点类

技术分享图片

 

 看到,apply就是生成代理类得函数。接着点进去,在实现类中找到

技术分享图片

 

 然后到

技术分享图片

其中proxyName就是代理类得类名,porxyPkg是$Proxy所以代理类就是$Proxy0,$Proxy1这样得类名,往下翻是生成字节码得方法,其中生成字节码得方法不然看,属于安全问题而放在了一个安全得包中。但是我们将生成得字节码从内容中读出并放在文件中。反编译后如下。

 

Java反射

原文:https://www.cnblogs.com/ant-xu/p/11720984.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!