首页 > 其他 > 详细

动态代理

时间:2021-05-26 01:02:12      阅读:31      评论:0      收藏:0      [点我收藏+]

复习反射

反射的定义:在运行状态时(动态的),对于任意一个类,都能够得到这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意属性和方法。这种动态获取的信息以及动态调用对象的方法的功能称之为java语言的反射机制.

反射的三种用法

public class ClassDemo02 {

     public static void main(String[] args) {
          Person p1 = new Person("小明" ,20,‘男‘ );
          Person p2 = new Person("小红" ,23,‘女‘ );

           //创建Class对象的方式一:(对象.getClass()),获取person类中的字节码文件
           Class class1 = p1.getClass();
          System. out.println(p1.getClass().getName());
           Class class2 = p2.getClass();
          System. out.println(class1 == class2 );

          System. out.println("==============================" );
           //创建Class对象的方式二:(类.class:需要输入一个明确的类,任意一个类型都有一个静态的class属性)
           Class class3 = Person.class;
          System. out.println(class1 == class2);

          System. out.println("==============================" );
           //创建Class对象的方式三:(forName():传入时只需要以字符串的方式传入即可)
           //通过Class类的一个forName(String className)静态方法返回一个Class对象,className必须是全路径名称;
           //Class.forName()有异常:ClassNotFoundException

           Class class4 = null;
           try {
              class4 = Class.forName("cn.itcast.Person");
          } catch (ClassNotFoundException e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
          }
          System. out.println(class4 == class3);
     }
}

动态代理

对于JDK动态代理,其必须要有接口
代码案例
接口

package bjpowernode;

public interface HelloService {
     void sayhello(String name);
}

方法HelloServiceimpl

package bjpowernode.Service;

import bjpowernode.HelloService;

public class HelloServiceimpl implements HelloService {
    @Override
    public void sayhello(String name) {
        System.out.println("你好:"+name);
    }
}

被代理的方法TestApp

package bjpowernode;

import bjpowernode.Service.HelloServiceimpl;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestApp {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        HelloService service = new HelloServiceimpl();

        service.sayhello("zhangsan");



        //使用反射机制执行sayhello方法
        HelloService target = new HelloServiceimpl();
        //获取hello名称对饮的Method类对象
        //关于.class.getMethod()方法:作用是获得对象所声明的公开方法,该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型。
        //在sayhello方法中,方法的类型是String,因此第二个参数为String.class
        Method method = HelloService.class.getMethod("sayhello", String.class);


        //通过method可以调用sayhello方法
		//表达的意思是method方法执行的对象是sayhello,参数是李四
        method.invoke(target,"李四");
    }
}

动态代理

原文:https://www.cnblogs.com/hello-liu/p/14811300.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!