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