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的代理就是客戶端不之再直接與真實對象打交道,而是經過一箇中間層來訪問,這個中間層就是代理。例如咱們租房子就是一個道理。web

在java的不少應用場景都使用了代理類,好比AspectJ的實現,RPC 遠程調用,Spring的AOP的實現(日誌攔截 • 聲明式事務處理),webservice ,mybatis中實現攔截器插件 等,在java中代理重要有:靜態代理,Jdk的動態代理,CGLIB的動態代理。mybatis

 

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

    }
}
相關文章
相關標籤/搜索