13.1. jvm之动态代理之示例及接口限制
1. 欲代理的类必须实现某个接口,若不实现接口则会报以下异常
具体测试代码
package com.kevin;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/**
* Created by liukai on 17/8/13.
*/
public class DynaProxy {
public static void main(String []args){
PersonProxy proxy= new PersonProxy(new Kevin());
//直接生成类而非接口
Kevin kevin = (Kevin)Proxy.newProxyInstance(DynaProxy.class.getClassLoader(),new Class[]{Kevin.class},proxy);
kevin.sleep();
}
}
class Kevin {
public void sleep(){
System.out.println("小明在睡觉");
}
}
class PersonProxy implements InvocationHandler {
Kevin obj = null;
public PersonProxy(Kevin kevin){//直接代理类,而非接口
obj = kevin;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("小明在脱衣服");
method.invoke(obj,args);
System.out.println("小明在穿衣服");
return null;
}
}
修改以上代码
package com.kevin;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/**
* Created by liukai on 17/8/13.
*/
public class DynaProxy {
public static void main(String []args){
PersonProxy proxy= new PersonProxy(new Kevin());
//生成代理接口 生成的对象必须用接口声明,并且只能转换为new Class[]{Person.class}中包含的接口
Person kevin = (Person)Proxy.newProxyInstance(DynaProxy.class.getClassLoader(),new Class[]{Person.class},proxy);//new Class[]{Person.class中必须是接口的class对象,不可以是类的class对象,否则会报对象不是接口
//Person kevin = (Person)Proxy.newProxyInstance(DynaProxy.class.getClassLoader(),Kevin.class.getInterfaces(),proxy);
kevin.sleep();
}
}
interface Person{
void sleep();
}
class Kevin implements Person{
public void sleep(){
System.out.println("小明在睡觉");
}
}
class PersonProxy implements InvocationHandler {
Person obj = null;
public PersonProxy(Person kevin){//直接代理类,而非接口
obj = kevin;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("小明在脱衣服");
method.invoke(obj,args);
System.out.println("小明在穿衣服");
return null;
}
}
所以一个类若未实现接口是无法使用jdk动态代理的