前言:
反射库(reflect library)提供了一个非常丰富且精心设计的工具集,以便于编写能够动态操纵Java代码的程序。这项功能被大量的应用于JavaBean中,它是Java组件的体系结构。 使用反射,在设计或者是运行时添加新的类,能够快速的应用开发工具动态的查询新添加类的功能。 Class类:可以通过Class这个专门的Java类访问类的信息。Class类实际上是泛型类,例如Class<?> perClazz = null;。在大多数情况下,可以忽略类型参数,而使用原始的Class类。 一.什么是反射? 能够分析类能力的程序称为反射。反射机制是在运行状态中:对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
二、反射提供的功能? 在运行时判断任意一个对象所属的类。 在运行时构造任意一个类的对象。 在运行时判断任意一个类所具有的成员变量和方法。 在运行时调用任意一个对象的方法。 生成动态代理。 三、获取Class类对象的三种方法: Class.forName(“全类名”); XX.class; 对象.getClass(); package com.uzz.test;
import com.uzz.entity.Person;
public class ReflectDemo01 { // 通过反射获取类 public static void demo01() { /** * 获取反射对象(反射入口) 1.Class.forName(全类名) 2.XX.class 3.对象.getClass() */
// 第一种:通过字符串拿到类 Class<?> perClazz = null; try { perClazz = Class.forName("com.uzz.entity.Person"); System.out.println(perClazz); } catch (ClassNotFoundException e) { e.printStackTrace(); }
// 第二种:类名.class Class<?> perClazz2 = Person.class; System.out.println(perClazz2);
// 第三种:对象.getClass() Person person = new Person(); System.out.println(person.getClass());
}
public static void main(String[] args) { demo01(); } }
四、通过反射获取所有的公共方法(1.本类 以及 父类 2.符合访问修饰符规律)以及获取当前类的所有方法 package com.uzz.test;
import java.lang.reflect.Method;
public class ReflectDemo02 {
/** * 获取方法 * */ public static void demo02() { // Class入口 Class<?> perClazz = null; try { perClazz = Class.forName("com.uzz.entity.Person"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
// 获取所有的公共的方法(1.本类 以及 父类、接口中的所有方法 2.符合访问修饰符规律) Method[] methods = perClazz.getMethods(); for (Method method : methods) { System.out.println(method); }
System.out.println("=================获取所有方法====================="); // 获取当前类的所有方法(1.只能是当前类 2.忽略访问修饰符限制) Method[] declaredMethods = perClazz.getDeclaredMethods(); for (Method method : declaredMethods) { System.out.println(method); } } public static void main(String[] args) { demo02(); } }
五、通过反射获取当前类的所有接口 package com.uzz.test;
public class ReflectDemo03 {
// 获取所有的接口 public static void demo03() { Class<?> perClazz = null; try { perClazz = Class.forName("com.uzz.entity.Person"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
// 拿到当前类的接口 Class<?>[] interfaces = perClazz.getInterfaces(); // 遍历 for (Class<?> inter : interfaces) { System.out.println(inter); } }
public static void main(String[] args) { demo03(); } }
六、通过反射获取当前类的父类 package com.uzz.test;
public class ReflectDemo04 {
// 通过反射获取当前类的父类 public static void demo04() { Class<?> perClazz = null; try { perClazz = Class.forName("com.uzz.entity.Person"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
Class<?> superclass = perClazz.getSuperclass(); System.out.println(superclass); }
public static void main(String[] args) { demo04(); } } 七、通过反射获取所有的构造方法 package com.uzz.test;
import java.lang.reflect.Constructor;
public class ReflectDemo05 {
// 通过反射获取所有的构造方法 public static void demo04() { Class<?> perClazz = null; try { perClazz = Class.forName("com.uzz.entity.Person"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Constructor<?>[] constructors = perClazz.getConstructors(); for (Constructor<?> constructor : constructors) { System.out.println(constructor); } }
public static void main(String[] args) { demo04(); } }
八、通过反射获取所有的公共属性 package com.uzz.test;
import java.lang.reflect.Field;
public class ReflectDemo06 {
// 通过反射获取所有的公共属性 public static void demo06() { Class<?> perClazz = null; try { perClazz = Class.forName("com.uzz.entity.Person"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
Field[] fields = perClazz.getFields(); for (Field field : fields) { System.out.println(field); } }
public static void main(String[] args) { demo06(); } }
|