• JAVA 反射机制详解


    Java 反射机制详解:


     1.通过一个对象获得该对象完整的包名.类名

    Demo demo = new Demo();  //Demo在reflct包下
    System.out.println(demo.getClass().getName());  //reflect.Demo

    2.创建Class的对象(所有类的对象都是Class的对象)

     1 Class<?> demo1 = null;
     2 Class<?> demo2 = null;
     3 Class<?> demo3 = null;
     4 try {
     5       //尽量采用这种方式创建class对象
     6       demo1 = Class.forName("reflect.Demo");
     7 } catch (ClassNotFoundException e) {
     8       e.printStackTrace();
     9 }
    10 demo2 = new Demo().getClass();
    11 demo3 = Demo.class;

    3.通过Class实例化其他对象

     1       //创建Class对象
     2        Class<?> demo = null;
     3         try {
     4             demo = Class.forName("reflect.Demo");
     5         } catch (ClassNotFoundException e) {
     6             e.printStackTrace();
     7         }
     8 
     9         //通过Class对象创建其他类对象
    10         Demo demo1 = null;
    11         try {
    12             demo1 = (Demo) demo.newInstance();
    13         } catch (InstantiationException e) {
    14             e.printStackTrace();
    15         } catch (IllegalAccessException e) {
    16             e.printStackTrace();
    17         }
    18 
    19         demo1.setAge(25);
    20         demo1.setName("luotong");
    21         System.out.println(demo1.getName()+demo1.getAge());

    4.通过Class调用其他类中构造函数来创建对象

     1        //创建Class实例
     2         Class<?> demo = null;
     3         try {
     4             demo = Class.forName("reflect.Person");
     5         } catch (ClassNotFoundException e) {
     6             e.printStackTrace();
     7         }
     8 
     9         //获得构造器
    10         Constructor<?>[] constructors = demo.getConstructors();
    11 
    12         //利用不同的构造函数创建Person对象
    13         Person person1 = null;
    14         Person person2 = null;
    15         try {
    16             person1 = (Person) constructors[1].newInstance(12);
    17             person2 = (Person) constructors[2].newInstance("luotong");
    18         } catch (InstantiationException e) {
    19             e.printStackTrace();
    20         } catch (IllegalAccessException e) {
    21             e.printStackTrace();
    22         } catch (InvocationTargetException e) {
    23             e.printStackTrace();
    24         }
    25         //输出person对象
    26         System.out.println(person1.toString());
    27         System.out.println(person2.toString());

    5.获得其他类实现的接口

     1        //通过Class实例返回一个类实现的接口
     2         Class<?> demo = null;
     3         try {
     4             demo = Class.forName("reflect.Person");
     5         } catch (ClassNotFoundException e) {
     6             e.printStackTrace();
     7         }
     8 
     9         //获得Person实现的接口
    10         Class<?>[] interfaces = demo.getInterfaces();
    11         for (Class<?> anInterface : interfaces) {
    12             System.out.println("person实现的接口"+anInterface.getName());
    13         }

    6.获得其他类的父类

    1         //取得其他类的父类
    2         Class<?> demo = null;
    3         try {
    4             demo = Class.forName("reflect.Person");
    5         } catch (ClassNotFoundException e) {
    6             e.printStackTrace();
    7         }
    8         Class<?> superclass = demo.getSuperclass();
    9         System.out.println(superclass);

    7.获得其他类的构造函数

     1 //获得其他类中的全部构造函数
     2 Class<?> demo = null;
     3 try {
     4      demo = Class.forName("reflect.Person");
     5 } catch (ClassNotFoundException e) {
     6      e.printStackTrace();
     7 }
     8 
     9 Constructor<?>[] constructors = demo.getConstructors();
    10 for (Constructor<?> constructor : constructors) {
    11      System.out.println(constructor);
    12  }

    8.获得本类的全部属性

     1 //获得本类的全部属性
     2 Class<?> demo = null;
     3 try {
     4        demo = Class.forName("reflect.Person");
     5 } catch (ClassNotFoundException e) {
     6        e.printStackTrace();
     7 }
     8 Field[] declaredFields = demo.getDeclaredFields();
     9 System.out.println(declaredFields.length);
    10 for (Field declaredField : declaredFields) {
    11      //权限修饰符
    12      int modifiers = declaredField.getModifiers();
    13      String priv = Modifier.toString(modifiers);
    14      //属性类型
    15      Class<?> type = declaredField.getType();
    16      System.out.println(priv + " " + type.getName() + " " + declaredField.getName() + ";");
    17 }

    9.获得本类实现的接口或其父类的属性

     1 //获得父类或者实现的接口的全部属性
     2 Class<?> demo = null;
     3 try {
     4     demo = Class.forName("reflect.Person");
     5 } catch (ClassNotFoundException e) {
     6     e.printStackTrace();
     7 }
     8 //得到父类的属性
     9 Field[] fields = demo.getFields();
    10 for (Field field : fields) {
    11     //权限修饰符
    12     int modifiers = field.getModifiers();
    13     String priv = Modifier.toString(modifiers);
    14     //属性类型
    15     Class<?> type = field.getType();
    16     System.out.println(priv + " " + type.getName() + " " + field.getName());
    17 }

     10.通过反射调用其他类的方法

    Class<?> person = null;
    try {
          person = Class.forName("reflect.Person");
    } catch (ClassNotFoundException e) {
          e.printStackTrace();
    }
    try {
          //调用Person类的sayChina()方法
          Method sayChina = person.getMethod("sayChina");
          sayChina.invoke(person.newInstance());
          //调用Person类的sayHello()方法
           Method sayHello = person.getMethod("sayHello", String.class, int.class);
           sayHello.invoke(person.newInstance(),"luotong",26);
    } catch (Exception e) {
           e.printStackTrace();
    }

    11.调用其他类的set和get方法

     1 public static void main(String args[]){
     2         Class<?> demo1 = null;
     3         Object object = null;
     4         try {
     5             demo1 = Class.forName("reflect.Person");
     6         } catch (ClassNotFoundException e) {
     7             e.printStackTrace();
     8         }
     9 
    10         try {
    11             object = demo1.newInstance();
    12         } catch (InstantiationException e) {
    13             e.printStackTrace();
    14         } catch (IllegalAccessException e) {
    15             e.printStackTrace();
    16         }
    17         setter(object,"Sex","男",String.class);
    18         getter(object,"Sex");
    19     }
    20 
    21     /**
    22      * @param obj  //操作的对象
    23      * @param att  //操作的属性
    24      */
    25     public static void getter(Object obj,String att){
    26         try {
    27             Method method = obj.getClass().getMethod("get" + att);
    28             System.out.println(method.invoke(obj));
    29         } catch (Exception e) {
    30             e.printStackTrace();
    31         }
    32     }
    33 
    34     /**
    35      *
    36      * @param obj  操作的对象
    37      * @param att  操作的属性
    38      * @param value 设置的值
    39      * @param type  参数的类型
    40      */
    41     public static void setter(Object obj,String att,String value,Class<?> type){
    42         try {
    43             Method method = obj.getClass().getMethod("set" + att, type);
    44             method.invoke(obj,value);
    45         } catch (Exception e) {
    46             e.printStackTrace();
    47         }
    48     }

    【运行结果】 男

    12.通过反射操作属性

     1        Class<?> demo2 = null;
     2         Object obj = null;
     3         try {
     4             demo2 = Class.forName("reflect.Person");
     5             obj = demo2.newInstance();
     6             Field sex = demo.getDeclaredField("sex");
     7             sex.setAccessible(true);
     8             sex.set(obj,"男");
     9             System.out.println(sex.get(obj));
    10         } catch (Exception e) {
    11             e.printStackTrace();
    12         }
    【运行结果】 男

    13.通过反射取得并修改数组

    1 int[] temp = {1,2,3,4};
    2 Class<?> aClass = temp.getClass().getComponentType();
    3 System.out.println("数组类型"+aClass.getName());
    4 System.out.println("数组长度"+ Array.getLength(temp));
    5 System.out.println("数组的第一个元素"+Array.get(temp,0));
    6 Array.set(temp,0,100);  //修改数组的第一个元素为100
    7 System.out.println("修改后数组的第一个元素"+Array.get(temp,0));

    通过反射修改数组大小(略)

    动态代理:

    14.如何获得类加载器

    1 public static void main(String args[]){
    2    Test test = new Test();
    3    System.out.println(test.getClass().getClassLoader().getClass().getName());
    4 }
    【结果】 sun.misc.Launcher$AppClassLoader

    不容易记住的:

    1.

    getFields和getDeclaredFields区别:

    getFields返回的是声明为public的属性,包括父类中定义的属性。

    getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。

    2.

    getMethods()和getDeclaredMethods()区别:

    getMethods返回本类和父类中public的方法。

    getDeclaredMethods返回本类中的所有方法,不包括父类中的方法。

    3.

    getGenericInterface(),返回此对象所表示的类直接实现的接口。

    getInterface(),返回此对象所表示的类或接口实现的接口。

    4.getSuperClass(),返回某个类直接继承的父类

    getGenericSuperClass(),返回某个类直接的具有泛型的父类

     1 package com.guolele.web.controller;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Type;
     5 
     6 /**
     7  * Created by Administrator on 2016/6/7.
     8  */
     9 public class RefConstructor {
    10 
    11     public static void main(String[] args) throws Exception {
    12         RefConstructor refConstructor = new RefConstructor();
    13         refConstructor.getConstructor();
    14     }
    15 
    16     public void getConstructor() throws Exception {
    17         Class c = null;
    18         c = Class.forName("java.lang.Long");
    19 
    20         Class cs = java.lang.String.class;
    21 
    22         System.out.println("----------------------------");
    23 
    24         Constructor constructor = c.getConstructor(cs);
    25         System.out.println("通过参数获取指定Class对象的构造方法(包括父类和实现的接口中的构造方法)");
    26         System.out.println(constructor.toString());
    27 
    28         Constructor constructor1 = c.getDeclaredConstructor(cs);
    29         System.out.println("通过参数获取指定Class对象所表示的类或接口的构造方法");
    30         System.out.println(constructor1.toString());
    31 
    32         Constructor constructor2 = c.getEnclosingConstructor();
    33         System.out.println("获取本地或匿名Constructor对象,它表示基础类的立即封闭构造方法。");
    34         if (constructor2 != null) {
    35             System.out.println(constructor2.toString());
    36         } else {
    37             System.out.println("没有获取到任何构造方法");
    38         }
    39 
    40         Constructor[] constructors = c.getConstructors();
    41         System.out.println("获取指定Class对象的所有构造方法,包括其父类和实现的接口的构造方法");
    42         for (Constructor ct : constructors) {
    43             System.out.println(ct.toString());
    44         }
    45 
    46         System.out.println("--------------------------");
    47 
    48         Class[] interfaces = c.getInterfaces();
    49         System.out.println("返回实现的所有接口(包括父类实现的接口)");
    50         for (Class inf : interfaces) {
    51             System.out.println(inf.toString());
    52         }
    53 
    54         Type[] types = c.getGenericInterfaces();
    55         System.out.println("返回直接实现的接口");
    56         for (Type t : types) {
    57             System.out.println(t.toString());
    58         }
    59 
    60         Class superclass = c.getSuperclass();
    61         System.out.println("返回间接父类");
    62         System.out.println(superclass.toString());
    63 
    64         Type genericSuperclass = c.getGenericSuperclass();
    65         System.out.println("返回其直接继承父类");
    66         System.out.println(genericSuperclass.toString());
    67 
    68         System.out.println("返回实现的所有接口和父类");
    69         for (Class aClass : c.getClasses()) {
    70             System.out.println(aClass.toString());
    71         }
    72     }
    73 }

    结果:

    ----------------------------
    通过参数获取指定Class对象的构造方法(包括父类和实现的接口中的构造方法)
    public java.lang.Long(java.lang.String) throws java.lang.NumberFormatException
    通过参数获取指定Class对象所表示的类或接口的构造方法
    public java.lang.Long(java.lang.String) throws java.lang.NumberFormatException
    获取本地或匿名Constructor对象,它表示基础类的立即封闭构造方法。
    没有获取到任何构造方法
    获取指定Class对象的所有构造方法,包括其父类和实现的接口的构造方法
    public java.lang.Long(long)
    public java.lang.Long(java.lang.String) throws java.lang.NumberFormatException
    --------------------------
    返回实现的所有接口(包括父类实现的接口)
    interface java.lang.Comparable
    返回直接实现的接口
    java.lang.Comparable<java.lang.Long>
    返回间接父类
    class java.lang.Number
    返回其直接继承父类
    class java.lang.Number
    返回实现的所有接口和父类
    
    Process finished with exit code 0
  • 相关阅读:
    自身哲学
    horovod
    nvidia-smi 关键知识
    7.22实习培训日志-JSP Servlet
    7.20实习培训日志-Java基础程序设计结构
    7.19实习培训日志- java进阶
    7.18实习培训日志-环境配置与设计模式
    7.17实习培训日志-java基础
    7.10实习培训日志-Maven 敏捷编程
    7.15实习培训日志 java题解
  • 原文地址:https://www.cnblogs.com/tongluo/p/5424452.html
Copyright © 2020-2023  润新知