Java 注解、反射、代理 整理记录

2020-09-13  本文已影响0人  livesxu

1.注解:标签

2.反射:动态获取或者执行

3.代理:委托

1.动态代理

public class TestC implements TestP {
    @Override
    public String methodOne(String name) {
        return name + "method one";
    }

    @Override
    public void methodTwo() {

        System.out.println("method two");
    }
}
public class TestProxy {

    public static TestP createProxy(TestC testC) {

        TestP testP = (TestP)Proxy.newProxyInstance(testC.getClass().getClassLoader(), testC.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                System.out.println("proxy ..");

                return method.invoke(testC,args);
            }
        });

        return testP;
    }
}
public class Test2 {

    @Test
    void test() {

        TestC testC = new TestC();

        TestP testP = TestProxy.createProxy(testC);

        String c = testP.methodOne("boy");

        testP.methodTwo();

        System.out.println(c);
    }

}

2.cglib增强字节码:运行时创建目标类的子类,从而对目标类进行增强

public class TestEnhancer {

    public static TestC createEnhancer(TestC testC) {

        //创建增强对象
        Enhancer enhancer = new Enhancer();
        //设置父类
        enhancer.setSuperclass(TestC.class);
        //设置回调【拦截】
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

                System.out.println("enhancer ..");

                //执行方法
//                Object object = method.invoke(testC,objects);
                //执行代理类的方法(目标类和代理类式父子关系)
                Object object = methodProxy.invokeSuper(o,objects);
                return object;
            }
        });
        TestC testC1 = (TestC)enhancer.create();

        return testC1;
    }
}
上一篇下一篇

猜你喜欢

热点阅读