标签:通过 throws java代理 自定义 .com ... out 方法 gets
Java动态代理对于java的代理,有两个重要的类,分别是:Proxy和InvocationHandler。
其中InvocationHandler是自己定义的代理类需要实现的接口。其中要实现的方法是
Object invoke(Object proxy, Method method, Object[] args)throws Throwable
Proxy表示的时自定定义的代理的对象,method表示调用的方法,args表示调用的方法需要传入的参数。
Proxy中有一个静态的方法
Public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
loader表示自定义的代理的ClassLoader。可以通过Class 中getClassLoader()来获取
interfaces表示接口,使用Class中的getInterfaces()类获取,h是InvocationHandler的实例化,就是自定义的代理类。
以下是实例:
自定义的代理:
package cn.com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DyProxy implements InvocationHandler {
private Object obj;
public DyProxy(Object obj) {
this.obj = obj;br/>}
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
System.out.println("调用的方法: " + arg1.getName());
System.out.println("调用的类名: " + obj.getClass().getName());
System.out.println("arg0 " + arg0.getClass().getName());
return arg1.invoke(obj, arg2);
}
}
定义的接口:
package cn.com.proxy.service.api;
public interface StudentService {
public String getStudent();
}
实现的接口定义:
package cn.com.proxy.service.impl;
import cn.com.proxy.service.api.StudentService;
public class StudentServiceImpl implements StudentService {br/>@Override
public String getStudent() {
System.out.println("getStudent");
return "sucess";
}
}
执行类:
package cn.com.proxy;
import java.lang.reflect.Proxy;
import cn.com.proxy.service.api.StudentService;
import cn.com.proxy.service.impl.StudentServiceImpl;
public class TestMain {
public static void main(String[] args) throws ClassNotFoundException {
//创建自己定义的借口实例
StudentService student = new StudentServiceImpl();
Class cls = Class.forName("cn.com.proxy.service.impl.StudentServiceImpl");
System.out.println(cls.getName() + " ============================ ");
//实例化自己定义的代理对象
DyProxy instance = new DyProxy(student);
//进行代理
StudentService sub = (StudentService) Proxy.newProxyInstance(instance.getClass().getClassLoader(),
student.getClass().getInterfaces(), instance);
//在代理的情况下调用方法
sub.getStudent();
}
}
标签:通过 throws java代理 自定义 .com ... out 方法 gets
原文地址:http://blog.51cto.com/xiaoshunzi/2351013