首页 > 代码库 > Java 反射

Java 反射

  Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。使用反射Java程序可以加载一个运行时才得知名称的class,获悉其完整构造。

反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法;
  • 在运行时调用任意一个对象的方法;
  • 生成动态代理。

优点: 
(1)能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。 
(2)与Java动态编译相结合,可以实现无比强大的功能 
缺点: 
(1)使用反射的性能较低 
(2)使用反射相对来说不安全 
(3)破坏了类的封装性,可以通过反射获取这个类的私有方法和属性 

一、Class类

  Java所有类都是Class类的实例

二、类的反射

  1.通过类名获取         类名.class
  2.通过对象获取         对象名.getClass()
  3.通过全类名获取      Class.forName(全类名)

public class Test {
    
    public static void main(String[] args) throws ClassNotFoundException {
        Class class1 = User.class;
        Class class2 = new User().getClass();
        Class class3 = Class.forName("com.sa.pojo.User");
        System.out.println("className: " + class1.getName());
        // 父类
        Class parentClass = class1.getSuperclass();
        System.out.println("parentClass: " + parentClass.getName());
     // 接口
        Class[] interfaces = class1.getInterfaces(); 
        System.out.print("Interfaces:  ");
        for(Class clazz : interfaces) 
            System.out.print(clazz.getName() + " ");       
    }
}

运行结果         

  className: com.sa.pojo.User
  parentClass: java.lang.Object
  Interfaces: java.io.Serializable

三、方法的反射

public class Test {
    
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> clazz = User.class;
        Method[] methods = clazz.getDeclaredMethods();
        for(Method method : methods) {
            // 函数限定符、返回值类型
            System.out.print(Modifier.toString(method.getModifiers()) 
                 + " " + method.getReturnType().getName() + " " + method.getName() + "("); // 函数参数列表 Class<?> types[] = method.getParameterTypes(); if(types.length == 0) System.out.println(")"); else for(int i = 0; i < types.length; i++) System.out.print(types[i].getTypeName() + (i + 1 == types.length ? ")\n" : ",")); } } }

运行结果     

  public java.lang.String toString()
  public java.lang.String getName()
  public void setName(java.lang.String)
  public int getAge()
  public void setAge(int)

通过反射调用类方法

public class Test {
    
    public static void main(String[] args) throws Exception {
        Class<?> clazz = User.class;
        Method method1 = clazz.getMethod("setName", String.class);
        Object obj = clazz.newInstance();
        method1.invoke(obj, "rose");
        Method method2 = clazz.getMethod("getName");
        String name = (String) method2.invoke(obj);
        System.out.println(obj);
    }
}

运行结果      User [age=0, name=rose]

四、属性的反射

public class Test {
    
    public static void main(String[] args) throws Exception {
        Class<?> clazz = User.class;
        // 打印类中的所有属性
        Field[] fields = clazz.getDeclaredFields();
        for(Field field : fields) {
            System.out.println(Modifier.toString(field.getModifiers()) + " " + field.getType().getName());
        }
        // 通过反射操作类中的字段
        Object obj = clazz.newInstance();
        Field field1 = clazz.getDeclaredField("age");
        field1.setAccessible(true);
        field1.set(obj, 100);
        System.out.println(obj);
    }
}

 运行结果

  private int
  private java.lang.String
  User [age=100, name=null]

Java 反射