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");

    }
}

 

 

 

 

 

      

    

       

 

posted @ 2019-10-24 22:25  阿福聊编程  阅读(140)  评论(0编辑  收藏  举报