**jdk动态代理:
jdk动态代理面向接口的动态代理,一定要有接口和实现类存在,代理对象增加的是实现类,在实现接口的方法重写的方法代理的对象只能转化成接口,不能转化成被代理的类。
只增强接口定义的方法。
只能读取到接口方法的注解。
**
package com.yxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Jdk {
public static void main(String[] args) {
Dinner dinner=new Person("yzy");
/*被代理对象的类加载器*/
ClassLoader classLoader = dinner.getClass().getClassLoader();
Class<?>[] interfaces = dinner.getClass().getInterfaces();
InvocationHandler invocationHandler=new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res=null;
if (method.getName().equals("eat")){
System.out.println("饭前洗手");
res=method.invoke(dinner,args);
System.out.println("饭后刷碗");
}else {
res=method.invoke(dinner,args);
}
return res;
}
};
Dinner dinner1 = (Dinner) Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
dinner1.eat("汉堡");
}
}
interface Dinner{
void eat(String foodName);
void drink();
}
class Person implements Dinner{
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void eat(String foodName) {
System.out.println(name+"正在吃"+foodName);
}
@Override
public void drink() {
System.out.println(name+"正在喝");
}
}
class Student implements Dinner{
private String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void eat(String foodName) {
System.out.println(name+"正在食堂吃"+foodName);
}
@Override
public void drink() {
System.out.println(name+"正在喝可乐");
}
}
**
cgilb动态代理
package com.yxy;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class Cglib {
public static void main(String[] args) {
Person person=new Person();
/*设置Enhancer*/
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(person.getClass());
MethodInterceptor methodInterceptor=new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object res=null;
if (method.getName().equals("eat")){
System.out.println("饭前洗手");
res=methodProxy.invokeSuper(o,objects);
System.out.println("洗碗");
}else{
res=methodProxy.invoke(o,objects);
}
return res;
}
};
enhancer.setCallback(methodInterceptor);
Person person1 = (Person)enhancer.create();
person1.eat("米饭");
}
}
class Person{
public Person() {
}
public void eat(String foodName){
System.out.println("正在吃"+foodName);
}
}
`