Java Proxy.newProxyInstance () выдает исключение приведения типа? - PullRequest
0 голосов
/ 07 января 2019

Мой следующий код пытается создать прокси-объект, который я ожидал напечатать «до» перед вызовом «say ()»:

class Person2 {
    private String name;
    public Person2(String name) {
        this.name = name;
    }
    public void say() {
        System.out.println("Person:" + name);
    }
}
class MyHandler implements InvocationHandler {
    private Object object;
    public MyHandler(Object o) {
        object = o;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //
        System.out.println("before");
        return method.invoke(object, args);
    }
}
public class TestProxy {
    public static void main(String [] args) {
        Person2 p = new Person2("myName");
        InvocationHandler invocationHandler = new MyHandler(p);
        Person2 obj = (Person2) Proxy.newProxyInstance(
                p.getClass().getClassLoader(),
                p.getClass().getInterfaces(),
                invocationHandler);
        obj.say();
    }
}

Но на самом деле он выбросит исключение:

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to Person2
at TestProxy.main

Так где я ошибся и как это исправить?

1 Ответ

0 голосов
/ 07 января 2019

java.lang.reflect.Proxy может быть приведен только к Interface, и эта строка кода p.getClass().getInterfaces() вернет пустой интерфейс, потому что Person2 не реализует ничего,
поэтому для исправления этого Person2 необходимо реализовать Interface:

public class Person2 implements IPerson{
    private String name;
    public Person2(String name) {
       this.name = name;
    }
    @Override
    public void say() {
       System.out.println("Person:" + name);
    }
}

Интерфейс:

public interface IPerson {
   public void say();
}

затем в основном статическом методе может привести Proxy к Интерфейсу и вызвать метод:

public class TestProxy {
    public static void main(String [] args) {
       Person2 p = new Person2("myName");
       InvocationHandler invocationHandler = new MyHandler(p);
       IPerson obj = (IPerson) Proxy.newProxyInstance(
             p.getClass().getClassLoader(),
             p.getClass().getInterfaces(),
             invocationHandler);
       obj.say();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...