反射复习笔记 (3)

获取运行时类的带泛型的父类

public class Solution { public static void main(String[] args) { Class<Solution> solutionClass = Solution.class; Type genericSuperclass = solutionClass.getGenericSuperclass(); } } 其他获取

获取运行时类实现的接口

public class Solution { public static void main(String[] args) { Class<Solution> solutionClass = Solution.class; Class<?>[] interfaces = solutionClass.getInterfaces(); } }

获取运行时类的父类所实现的接口

public class Solution { public static void main(String[] args) { Class<Solution> solutionClass = Solution.class; Class<? super Solution> superclass = solutionClass.getSuperclass(); } }

获取当前运行时类所在的包

public class Solution { public static void main(String[] args) { Class<Solution> solutionClass = Solution.class; Package aPackage = solutionClass.getPackage(); } }

获取运行时类声明的注解

public class Solution { public static void main(String[] args) { Class<Solution> solutionClass = Solution.class; Annotation[] annotations = solutionClass.getAnnotations(); } } 调用运行时类的指定结构 调用运行时类的指定属性

方法一(不常用):

public class Solution { public static void main(String[] args) throws Exception { Class<Persion> persionClass = Persion.class; // 创建运行时类的对象 Persion persion = persionClass.newInstance(); // 获取指定的属性,要求运行时类声明的该属性为public // 通常不采用此方法 Field id = persionClass.getField("id"); // 设置当前属性的值 id.set(persion, 123); int pid = (int) id.get(persion); System.out.println(pid); } }

方法二:

public class Solution { public static void main(String[] args) throws Exception { Class<Persion> persionClass = Persion.class; // 创建运行时类的对象 Persion persion = persionClass.newInstance(); // 获取运行时类中指定的变量名的属性(私有的属性也可以获取) Field name = persionClass.getDeclaredField("name"); // 设置当前属性是可以访问的 name.setAccessible(true); name.set(persion, "李四"); System.out.println(name.get(persion)); } }

调用静态属性

public class Solution { public static void main(String[] args) throws Exception { Class<Persion> persionClass = Persion.class; // 创建运行时类的对象 Persion persion = persionClass.newInstance(); // 获取运行时类中指定的变量名的属性(私有的属性也可以获取) Field name = persionClass.getDeclaredField("name"); // 设置当前属性的值 name.setAccessible(true); name.set(Persion.class, "李四"); System.out.println(name.get(Persion.class)); } } 调用运行时类的指定方法

调用非静态方法

public String show(String s) { System.out.println(s); return s; } public class Solution { public static void main(String[] args) throws Exception { Class<Persion> persionClass = Persion.class; // 创建运行时类的对象 Persion persion = persionClass.newInstance(); // 获取运行时类中指定的变量名的属性(私有的属性也可以获取) Method show = persionClass.getDeclaredMethod("show", String.class); show.setAccessible(true); Object o = show.invoke(persion, "中国"); System.out.println(o); } }

调用静态方法

public static void showDesc() { System.out.println("静态方法"); } public class Solution { public static void main(String[] args) throws Exception { Class<Persion> persionClass = Persion.class; // 创建运行时类的对象 Persion persion = persionClass.newInstance(); // 获取运行时类中指定的变量名的属性(私有的属性也可以获取) Method showDesc = persionClass.getDeclaredMethod("showDesc"); showDesc.setAccessible(true); showDesc.invoke(Persion.class); } } 调用运行时类的指定构造器

调用默认构造器

public class Solution { public static void main(String[] args) throws Exception { Class<Persion> persionClass = Persion.class; Persion persion = persionClass.newInstance(); } }

调用指定的构造器去创建对象

public class Solution { public static void main(String[] args) throws Exception { Class<Persion> persionClass = Persion.class; // 获取指定的构造器 Constructor<Persion> declaredConstructor = persionClass.getDeclaredConstructor(String.class); // 保证该构造器是可以访问的 declaredConstructor.setAccessible(true); // 通过指定构造器创建对象 Persion persion = declaredConstructor.newInstance("lisi"); } } 反射的应用:动态代理

代理设计模式原理

使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上

静态代理

静态代理:编译期间,代理类与被代理类就已经确定了

代码实现:

接口:

interface ClothFactory { void produceCloth(); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygxjs.html