zoukankan      html  css  js  c++  java
  • Java反射

     

    一.反射概念:

         java反射就是动态的获取类信息(包括类的继承,接口的实现,类的方法,属性 等)。

    二.Class类的获取

    @Test
        public  void testClasss() throws Exception{
            //第一种
            System.out.println(Class.forName("java.lang.String"));
            //第二种
            String str=new String();
            System.out.println(str.getClass());
            //第三种
            System.out.println(String.class);
        }
    

    三.获取类的信息

    @Test
        public void testClass(){
          try {
              Class clazz= Class.forName("java.lang.String");
              //获得类的构造方法
              Constructor[] constructorS=  clazz.getConstructors();
              for (Constructor constructor:constructorS) {
                  System.out.println(constructor);
              }
              //获取指定参数的构造方法
             Constructor constructor= clazz.getConstructor(String.class);
             String str=(String)constructor.newInstance("String字符窜"); //实例化对象(String str=new String())
             System.out.println(str);
    
          }catch (Exception e){
              e.printStackTrace();
          }
    
        }
    
     //通过反射获得类的方法的全名称
        @Test
        public static void methodTest() throws ClassNotFoundException {
            Class<?> clazz = Class.forName("java.lang.String");
            Method[] methods = clazz.getMethods();
            for (int i = 0; i < methods.length; i++) {
                System.out.print(Modifier.toString(methods[i].getModifiers()) + " ");
                System.out.print(methods[i].getReturnType().getSimpleName() + " ");
                System.out.print(methods[i].getName() + "(");
                Class[] clType = methods[i].getParameterTypes();
                if (clType.length > 0) {
                    for (int j = 0; j < clType.length; j++) {
                        System.out.print(" " + clType[j].getSimpleName() + " " + "arg" + j);
                        if (j < clType.length - 1) {
                            System.out.print(",");
                        }
                    }
    
                }
                System.out.print(")");
                Class[] clEx = methods[i].getExceptionTypes();
                if (clEx.length > 0) {
                    for (int t = 0; t < clEx.length; t++) {
                        System.out.print("throws " + clEx[t].getSimpleName());
                        if (t < clEx.length - 1) {
                            System.out.println(",");
                        }
                    }
                }
                System.out.println();
    
            }
    
        }
    

     四.代理模式(Proxy pattern)

            Java的代理就是客户端不之再直接与真实对象打交道,而是通过一个中间层来访问,这个中间层就是代理。例如我们租房子就是一个道理。

    在java的很多应用场景都使用了代理类,比如AspectJ的实现,RPC 远程调用,Spring的AOP的实现(日志拦截 • 声明式事务处理),webservice ,mybatis中实现拦截器插件 等,在java中代理重要有:静态代理,Jdk的动态代理,CGLIB的动态代理。

    1.静态代理模式

    //抽象角色
    public interface UserManager {
    
       public void addUser(String userId, String userName);
    
       public  void delUser(String userId);
    
       public  String findUser(String userId);
    
       public void modifyUser(String userId, String userName);
    }
    
    //真实角色
    public class UserManagerImpl implements UserManager {
        @Override
        public void addUser(String userId, String userName) {
            System.out.println("添加用户!!!!!!!");
        }
    
        @Override
        public void delUser(String userId) {
            System.out.println("删除用户!!!!!!!");
        }
    
        @Override
        public String findUser(String userId) {
            System.out.println("查询用户!!!!!!!");
            return null;
        }
    
        @Override
        public void modifyUser(String userId, String userName) {
            System.out.println("修改用户!!!!!!!");
        }
    }
    
    //代理对象
    public class ProxyUserManagerImpl implements UserManager {
        //持有真实对象的引用
        private UserManager userManager;
    
        public ProxyUserManagerImpl(UserManager userManager) {
            this.userManager = userManager;
        }
    
        @Override
        public void addUser(String userId, String userName) {
            System.out.println("添加用户开始!!!!!!!!!!!!!!!");
            userManager.addUser(userId,userName);
            System.out.println("添加用户结束!!!!!!!!!!!!!!!!!");
        }
    
        @Override
        public void delUser(String userId) {
    
        }
    
        @Override
        public String findUser(String userId) {
            return null;
        }
    
        @Override
        public void modifyUser(String userId, String userName) {
    
        }
    }
    
    public static void main(String[] args) {
            UserManager userManager=new ProxyUserManagerImpl(new UserManagerImpl());
            userManager.addUser("1","张三");
        }
    

     2.JDK动态代理(基于接口)

    //接口

    public interface Star { void confer(String str,String str1); void signContract(); void bookTicket(); void sing(); void collectMoney(); }
    //真实对象
    public class RealStar implements Star {
    
        @Override
        public void bookTicket() {
            System.out.println("RealStar.bookTicket()");
        }
    
        @Override
        public void collectMoney() {
            System.out.println("RealStar.collectMoney()");
        }
    
        @Override
        public void confer(String str,String str1) {
            System.out.println("RealStar.confer()");
        }
    
        @Override
        public void signContract() {
            System.out.println("RealStar.signContract()");
        }
    
        @Override
        public void sing() {
            System.out.println("RealStar(周杰伦本人).sing()");
        }
    
    
    }
    
    //代理对象
    public class StarHandler implements InvocationHandler {
        private Star realStar;
    
        public StarHandler(Star realStar) {
            this.realStar = realStar;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("方法执行开始!!!!!!!!!!!!!!!");
            for (int i =0;i<args.length;i++){
                System.out.println("参数"+i+args[i]);
            }
            if (method.getName().equals("confer")) {
                return method.invoke(realStar,args);
            }
            System.out.println("方法执行后!");
            return null;
        }
    }
    
    //测试类
    public class Client {
        public static void main(String[] args) {
            Star star=new RealStar();
            StarHandler starHandler=new StarHandler(star);
            Star proxy=(Star) Proxy.newProxyInstance(star.getClass().getClassLoader(),star.getClass().getInterfaces(),starHandler);
            proxy.confer("你好啊","我很好");
    
    
        }
    
    }
    

     3.CGLIB的动态代理(基于类)

    public class User {
    
        public void add(Object object){
            System.out.println("User.add");
        };
    
        public  void  update(String id){
            System.out.println("User.update");
        };
    }
    
    public class MyInterPatter implements MethodInterceptor {
    
        /**
         * o:cglib生成的代理对象
         * method:被代理对象方法
         * objects:方法入参
         * methodProxy: 代理方法
         */
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("前置通知!!!!!!!!!!!!!!!!!");
            methodProxy.invokeSuper(o,objects);
            System.out.println("后置通知!!!!!!!!!!!!");
    
            return null;
        }
    }
    
    //测试类
    public class CglibPatternTest {
    
        public static void main(String[] args) {
            //通过CGLIB动态代理获取代理对象
            Enhancer enhancer=new Enhancer();
            // 设置enhancer对象的父类
            enhancer.setSuperclass(User.class);
            // 设置enhancer的回调对象
            enhancer.setCallback(new MyInterPatter());
            // 创建代理对象
            User proxy= (User)enhancer.create();
            // 通过代理对象调用目标方法
            proxy.add("你好a");
    
        }
    }
    

          

        

           

  • 相关阅读:
    java项目中文件含义
    关于反射技术
    Subversion Edge部署
    svn Edge访问规则配置
    redhat开启端口
    关于Ant脚本
    Maven
    版本控制工具
    Oracle了解(一)
    java 空格替换%20
  • 原文地址:https://www.cnblogs.com/xiaofuzi123456/p/11735420.html
Copyright © 2011-2022 走看看