Java中的反射机制

来源:互联网 发布:淘宝客收入排行榜 编辑:程序博客网 时间:2024/05/17 05:53

1.反射:就是加载类,并解剖出类的各个组成部分(构造函数:实例化和初始化对象;方法:完成特定的功能;字段:封装数据),解剖出的成员分别使用Constructor、Method、Field对象表示。

         //加载1
        Class clazz1=Class.forName("/Myday01/src/cn/itcast/reflect/Person");
   //加载2
Class clazz2=new Person().getClass();
//加载3
Class clazz3=Person.class;

2.反射构造函数:

   反射public构造函数

   // 解剖构造函数:public Person(String name)
@Test
public void test2() throws ClassNotFoundException, NoSuchMethodException,
SecurityException, InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Constructor c = clazz.getConstructor(String.class);
Person p = (Person) c.newInstance("xiaoming");
System.out.println(p.name);
}

    反射私有的构造函数

  //解剖构造函数:private Person(List list)
@Test
public void test3() throws Exception{
Class clazz= Class.forName("cn.itcast.reflect.Person");
Constructor c=clazz.getDeclaredConstructor(List.class);
c.setAccessible(true);
Person p = (Person) c.newInstance(new ArrayList());
System.out.println(p.name);
}

3.反射方法:

 //反射类的方法 public void aa()
@Test
public void test1() throws Exception{
Person p = new Person();//指明是调用那个对象的方法
Class clazz=Class.forName("cn.itcast.reflect.Person");
Method method=clazz.getMethod("aa", null);
method.invoke(p, null);
}

  //反射类的方法public static void main(String[] args)
@Test
public void test2() throws Exception{
//Person p = new Person();//静态方法的调用不需要对象
Class clazz=Class.forName("cn.itcast.reflect.Person");
Method method=clazz.getMethod("main", String[].class);
//method.invoke(null, new String[]{"aa","123"});//不行,因为在调用main方法时候,看到数组会对其中的变量进行拆分,和原来的String[]不一致,导致出现“Wrong number of arguments”
//解决方案1:
method.invoke(null, new Object[]{new String[]{"aa","123"}});
//解决方案2:
method.invoke(null, (Object)new String[]{"aa","123"});
}

4.反射字段

 //发射字段:public String name = "aaa";
@Test
public void test1() throws Exception{
Person p = new Person();
Class clazz=Class.forName("cn.itcast.reflect.Person");
Field f = clazz.getField("name");
String name= (String)f.get(p);
System.out.println(name);
}

0 0
原创粉丝点击