- package Study.ProxyStudy;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- public class ProxyTestThree {
- /**创建代理类的三种方式
- * @param args
- * @throws InvocationTargetException
- * @throws IllegalArgumentException
- * @throws IllegalAccessException
- * @throws InstantiationException
- * @throws SecurityException
- * @throws NoSuchMethodException
- */
- public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
- // TODO Auto-generated method stub
- fun_A();
- fun_B();
- }
- public static void fun_A() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
- Class<?> clazz = Proxy.getProxyClass(Test.class.getClassLoader(), A.class, B.class);
- Constructor<?> con = clazz.getConstructor(InvocationHandler.class);
- //创建的代理类对象引用委托类实现接口A
- A obj = (A) con.newInstance(new InvocationHandler(){
- Test t = new Test(); //先在匿名内部类的成员位置创建一个目标类(委托类)对象
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- // TODO Auto-generated method stub
- Object obj = method.invoke(t, args);
- System.out.println("为代理类添加的功能一般是:安全、事务、日志方面的功能");
- return obj;
- }
- });
- obj.println_1(); //只能通过代理类调用接口中覆盖的方法
- //obj.println_2(); //报错
- }
- public static void fun_B(){
- B obj = (B) Proxy.newProxyInstance(Test.class.getClassLoader(), new Class[]{A.class, B.class},
- new InvocationHandler() {
- Test t = new Test();
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- // TODO Auto-generated method stub
- Object obj = method.invoke(t, args);
- System.out.println("为代理类添加的功能一般是:安全、事务、日志方面的功能");
- return obj;
- }
- });
- obj.println_2();
- }
- }
- interface A{
- void println_1();
- }
- interface B{
- void println_2();
- }
- //给Test类设计一个代理类
- class Test implements A, B{
- @Override
- public void println_1() {
- // TODO Auto-generated method stub
- System.out.println("覆盖接口A中的方法");
- }
- @Override
- public void println_2() {
- // TODO Auto-generated method stub
- System.out.println("覆盖接口B中的方法");
- }
- public void print3(int i){
- if(i > 0 ){
- this.println_1();
- }
- else{
- this.println_2();
- }
- }
- }
复制代码 以上代码中的委托类Test实现了两个接口A、B,本想尝试一下用两种创建代理类的方法(构造器创建、字节码直接创建)来调用委托类中的覆盖方法,可结果是:实现的代理类只能调用自己一个接口中的覆盖方法,如果想调用另外一个接口中的方法,必须再创建一个委托类;并且创建的代理类还不能调用委托类自身的方法?这到底是怎么回事,是不是我的代码和思路出了一点小问题没有发现还是说代理类只能调用一个接口的方法并且不能调用委托类自身的方法,求解释
|
|