反射
动态代理的思想分析
1、为什么需要代理
代理可以无侵入式的给对象新增其他的功能
2、代理长什么样?
代理里面就是对象要被代理的方法
3、Java通过什么来保障代理的样子
通过接口保证,后面的对象和代理需要实现同一个接口
接口中就是被代理的所有方法
动态代理的代码实现
1、如何为Java对象创建一个代理对象?
java.lang.reflect.Proxy类;提供了为对象产生代理对象的方法;
public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
参数一;用于指定用哪个类加载器,去加载生成代理
参数二;指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
参数三;用来指定生成的对象要干什么事情
package com.proxytest; /** * @author yl * @createDate 2023/4/12 * @description */ public class BigStar implements Star{ private String name; public BigStar() { } public BigStar(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String sing(String name) { System.out.println(this.name + "正在唱" + name); return "谢谢"; } @Override public void dance() { System.out.println(this.name + "正在跳舞"); } }
package com.proxytest; /** * @author yl * @createDate 2023/4/12 * @description */ public interface Star { // 我可以把所有想要代理的方法定义在接口中 // 唱歌 public abstract String sing(String name); // 跳舞 public abstract void dance(); }
package com.proxytest; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author yl * @createDate 2023/4/12 * @description */ public class ProxyUtil { /** * 发方法作用: * 给一个明星对象,创建一个代理 * 形参: * 被代代理的明星对象 * 返回值: * 给明星创建的代理 * * 需求: * 外面的人想要大明星唱一首歌 * 1、获取代理的对象 * 代理对象 = ProxyUtil。createProxy(大明星的对象) * 2、再调用代理的唱歌方法 * 代理对象.唱歌方法() */ public static Star createProxy(BigStar bigStar) { return (Star) Proxy.newProxyInstance( ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("sing".equals(method.getName())) { System.out.println("准备话筒收钱!!!!!!"); } else if ("dance".equals(method.getName())) { System.out.println("准备场地收钱"); } // 去找大明星唱歌跳舞 // 代码的表现形式:调用大明星里面唱歌或跳舞的方法 return method.invoke(bigStar,args); } } ); } }
package com.proxytest; /** * @author yl * @createDate 2023/4/12 * @description */ public class Test { public static void main(String[] args) { // 需求: // * 外面的人想要大明星唱一首歌 // * 1、获取代理的对象 // * 代理对象 = ProxyUtil。createProxy(大明星的对象) // * 2、再调用代理的唱歌方法 // * 代理对象.唱歌方法() // 1、获取代理的对象 BigStar bigStar = new BigStar("鸡哥"); Star proxy = ProxyUtil.createProxy(bigStar); // 2、调用唱歌的方法 String result = proxy.sing("只因你太美"); System.out.println(result); proxy.dance(); } }
什么是反射
反射允许对成员变量,成员方法和构造方法的信息进行编程访问
获取class对象的三种方式
源代码阶段用;Class.forName("全类名")
加载阶段;类名.class
运行阶段;对象.class
代码
student
package com.reflect2; /** * @author yl * @createDate 2023/4/12 * @description */ public class Student { private String name; private Integer age; @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } public Student(Integer age) { this.age = age; } public Student(String name) { this.name = name; } public Student() { } public Student(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
实现
package com.reflect2; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Parameter; /** * @author yl * @createDate 2023/4/14 * @description */ public class MyReflectDemo { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { /* class类中用于获取构造器方法的方法 Constructor<?>[] getConstructors() Constructor<?>[] getDeclaredConstructors() Constructor<T> getConstructor(Class<?>....parameterTypes) Constructor<T> getDeclaredConstructor(Class<?>....parameterTypes) */ //1.获取class字节码对象 Class aClass = Class.forName("com.reflect2.Student"); // 2.获取构造方法 Constructor[] cons1 = aClass.getConstructors(); for (Constructor constructor : cons1) { System.out.println(constructor); } System.out.println("----------"); Constructor[] cons2 = aClass.getDeclaredConstructors(); for (Constructor constructor : cons2) { System.out.println(constructor); } System.out.println("------------"); Constructor cons3 = aClass.getDeclaredConstructor(); System.out.println(cons3); System.out.println("-----------------"); Constructor cons4 = aClass.getDeclaredConstructor(String.class); System.out.println(cons4); int modifiers = cons4.getModifiers(); System.out.println(modifiers); Parameter[] parameters = cons4.getParameters(); for (Parameter parameter : parameters) { System.out.println(parameter); } // 暴力反射:表示临时取消权限校验 cons4.setAccessible(true); Student a = (Student) cons4.newInstance("a"); System.out.println(a); } }
浅谈Java反射2https://blog.csdn.net/qq_48817343/article/details/137826708?spm=1001.2014.3001.5502