package testdaili;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @ClassName: dailitest
* @Description: 本篇文章是对代理的复习
* @author: pgj
* @date: 2017年10月12日 下午8:36:30
*/
public class dailitest {
public static void main(String[] args) {
///静态代理
new teacher(new mother()).dosome();
///动态代理
working pro1=(working)new proxyman().getpreoxy(new father());
pro1.dosome();
working2 pro2=(working2)new proxyman().getpreoxy(new father());
pro2.play();
}
}
interface working{
void dosome();
///void speaker();静态代码缺点所在
}
///////////////////////静态代理////////////////////////
///这里是真是类
class mother implements working {
@Override
public void dosome() {
// TODO Auto-generated method stub
System.out.println("这里是真实类:妈妈指导孩子写作业");
}
}
//这里是代理类:静态代理,对真实进行封装,
class teacher implements working{
private mother mother;
public teacher(mother mother) {
// TODO Auto-generated constructor stub
this.mother=mother;
}
public void dosome() {
// TODO Auto-generated method stub
System.out.println("这是代理类:放学后老师叫家长指导学生写作业!");
mother.dosome();
System.out.println("这是代理类:老师批改作业");
}
}
////////////////////动态代理////////////////////
/***
*动态代理的优点:
*1.静态代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。
*如果接口增加一个方法,除了所有实现类需要实现这个方法外,
*所有代理类也需要实现此方法。增加了代码维护的复杂度,相对而言动态代理只需要实现真是类方法,少了一半。
*如果增加一个接口
*2.在静态代理中相较于动态代理,当需要编写大量的代理的时候,编写代理类麻烦了,简而言之,就是动态代理proxyman就像工厂一样,静态代理就像个体户
*
*
*/
interface working2{
void play();
}
class father implements working, working2{
@Override
public void dosome() {
// TODO Auto-generated method stub
System.out.println("这是真实类:爸爸带孩子玩!");
}
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("这是真实类:爸爸带孩子打球");
}
}
class proxyman implements InvocationHandler{
private Object object;///真是类
public Object getpreoxy(Object object){
this.object=object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(), this);
}
/////实现原理是反射
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("这是动态代理:工厂");
Object sss=method.invoke(object, args);
return sss;
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @ClassName: dailitest
* @Description: 本篇文章是对代理的复习
* @author: pgj
* @date: 2017年10月12日 下午8:36:30
*/
public class dailitest {
public static void main(String[] args) {
///静态代理
new teacher(new mother()).dosome();
///动态代理
working pro1=(working)new proxyman().getpreoxy(new father());
pro1.dosome();
working2 pro2=(working2)new proxyman().getpreoxy(new father());
pro2.play();
}
}
interface working{
void dosome();
///void speaker();静态代码缺点所在
}
///////////////////////静态代理////////////////////////
///这里是真是类
class mother implements working {
@Override
public void dosome() {
// TODO Auto-generated method stub
System.out.println("这里是真实类:妈妈指导孩子写作业");
}
}
//这里是代理类:静态代理,对真实进行封装,
class teacher implements working{
private mother mother;
public teacher(mother mother) {
// TODO Auto-generated constructor stub
this.mother=mother;
}
public void dosome() {
// TODO Auto-generated method stub
System.out.println("这是代理类:放学后老师叫家长指导学生写作业!");
mother.dosome();
System.out.println("这是代理类:老师批改作业");
}
}
////////////////////动态代理////////////////////
/***
*动态代理的优点:
*1.静态代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。
*如果接口增加一个方法,除了所有实现类需要实现这个方法外,
*所有代理类也需要实现此方法。增加了代码维护的复杂度,相对而言动态代理只需要实现真是类方法,少了一半。
*如果增加一个接口
*2.在静态代理中相较于动态代理,当需要编写大量的代理的时候,编写代理类麻烦了,简而言之,就是动态代理proxyman就像工厂一样,静态代理就像个体户
*
*
*/
interface working2{
void play();
}
class father implements working, working2{
@Override
public void dosome() {
// TODO Auto-generated method stub
System.out.println("这是真实类:爸爸带孩子玩!");
}
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("这是真实类:爸爸带孩子打球");
}
}
class proxyman implements InvocationHandler{
private Object object;///真是类
public Object getpreoxy(Object object){
this.object=object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(), this);
}
/////实现原理是反射
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("这是动态代理:工厂");
Object sss=method.invoke(object, args);
return sss;
}
}
最后:哎,点赞和评论的人好少啊!