反射

反射:

  在运行时动态分析或使用一个类进行工作。
  java.lang.Class类:描述类信息的类。
  类对象:描述一个类信息的对象,当虚拟机加载类的时候,就会创建这个类的类对象并加载该对象,Class是类对象的类型。

获得类对象的方式:

  用" 类名.class "获得这个类的类对象。
  用类的对象掉用getClass(),如object.getClass()得到这个对象的类型的类对象。
  可以使用Class.forName(类名),也可以得到这个类的类对象,(注意,这里写的类名必须是全限定名(全名),是包名加类名,XXX.XXX.XXXX)。
  基本类型也有类对象,用" 封装类.TYPE "可以获得对应的基本类型的类对象。


java.lang.reflect包下的三个重要类:

  Field属性类:用来描述属性的信息。
  Method方法类:方法的信息的描述。
  Constructor构造方法类:用来描述构造方法的信息。


Class类中的常用方法

newInstance()

  创建此 Class 对象所表示的类的一个新实例(调用无参构造创建的对象)。

getDeclaredMethods()

  获得的是一个Method方法类对象的数组,获得本类(不包括父类)声明的所有(包括private的)方法对象。

getMethods() //推荐使用

  获得的是一个Method方法类对象的数组,获得所有(父类的也包括)publice的方法对象。

getDeclaredConstructors()

  获得的是一个Constructor构造方法类对象的数组,获得这个类声明的所有构造方法对象。

getConstructors() //推荐使用

  获得的是一个Constructor构造方法类对象的数组,获得所有publice的构造方法对象。

getDeclaredFields() //推荐使用

  获得的是一个Field属性类对象的数组,获得本类声明的所有属性的属性对象。

getFields()

  获得的是一个Field属性类对象的数组,获得所有publice的属性对象。


使用反射构造一个类的对象的步骤

  1.  获得类对象
  2. 获得构造方法对象
  3. 获得对象,用构造方法对象调用构造方法,如果使用无参构造方法,可以跳过第二步,直接使用" 类对象.newInstance() "方法来获得这个类的对象
  4. 获得方法对象
  5. 用方法对象调用方法(用这个类的对象作为第一参数)


  如下面的例子:

反射机制的实现类:

 1 public class TestReflect
 2  {    
 3     public static Object get(String className , Map<String,Object> map) throws Exception
 4     {
 5         Class c = Class.forName(className); //获得类对象
 6         Object o = c.newInstance(); //获得对象
 7         Set<String> set = map.keySet();
 8         for(String str : set)
 9         {
10             String s = "set" + str.substring(0,1).toUpperCase()+str.substring(1);
11             Field f = c.getDeclaredField(str);
12             Method m = c.getMethod(s, f.getType()); //获得方法对象
13             m.invoke(o, map.get(str)); //用方法对象调用方法
14         }
15         return o;
16     }
17 
18     public static void main(String[] args) throws Exception 
19     {    
20         Map m = new HashMap();
21         m.put("name", "zhang");
22         m.put("age", 22);
23         Object o = get("day07.reflect.Student",m);
24         Student s = (Student) o;
25         System.out.println(s.getName() + " " + s.getAge());
26         
27         Map m1 = new HashMap();
28         m1.put("name", "li");
29         m1.put("gender", "男");
30         Object o1 = get("day07.reflect.Teacher",m1);
31         Teacher t = (Teacher) o1;
32         System.out.println(t.getName() + " " + t.getGender());
33     }
34 }
View Code

相关文章:

  • 2021-05-27
  • 2021-12-29
  • 2021-07-20
  • 2021-08-30
  • 2022-01-14
  • 2021-12-07
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-08-14
  • 2021-10-19
  • 2022-12-23
  • 2021-06-27
  • 2021-06-22
  • 2021-09-21
  • 2021-12-14
相关资源
相似解决方案