注意点:UserDao userDao = (UserDao) hello.createProxyInstance(new UserDaoImpl());中接收的userDao 必须是接口,如果是类,会报类型转换错误:Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to proxy.UserDao
具体实现:
package proxy;
public interface UserDao {
void addUser();
}
package proxy;
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
User user = new User();
user.setId(1);
user.setUsername("zhangsan");
user.setPassword("123456");
}
}
package proxy;
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HelloInvocationHandler implements InvocationHandler {
private Object targetObject;
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
helloWorld();
Object object = method.invoke(targetObject, args);
return object;
}
public void helloWorld() {
System.out.println("Hello world HelloInvocationHandler111");
}
}
main方法:
package proxy;
public class Demo {
public static void main(String[] args) {
HelloInvocationHandler hello = new HelloInvocationHandler();
UserDao userDao = (UserDao) hello.createProxyInstance(new UserDaoImpl());
userDao.addUser();
}
}
关键是实现InvocationHandler接口。