一.反射概念:
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"); } }