黑马程序员_反射

淺唱寂寞╮ 提交于 2020-04-07 19:27:19

 ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

反射

1、由来:

  程序后期扩展,无源码修改的扩展

2、java.lang.Class  描述.class的类

  java.lang.reflect.Constructor  描述构造方法的类

  java.lang.reflect.Field  描述成员变量的类

  java.lang.reflect.Method  描述成员方法的类

3、实现反射:

  A、获取class文件对象    

    第一种:通过对象获取

      Person p=new Person();

      Object中getClass(),返回值是Class类型

    第二种:

      通过类的静态属性class获取

    第三种:通过class类的静态方法forName获取

      class.forName("包名.Person");//要写全类名

  B、获取构造方法

    Class类中Constructor[] getConstructors() 获取class文件中公共权限的构造方法,

    Class类中ConStructor getConstructor(class...c)获取公共权限的指定参数列表的构造函数。如果获取没有可变参数的可以不写参数列表。

    Class类中Constructor[] getDeclaredConstructors() 获取全部构造函数

    Class类中ConStructor getDeclaredConstructor(Class...c)可以单独获取私有的构造方法

    

    运行构造方法:

      Constructor类中Object newInstance(Object...o)

      Constructor类的父类Accessible类中setAccessible(boolean 0)传递的若是true,运行期间则取消JVM的访问检查,即可运行私有构造函数。

      Class类中 Object newInstance()可以直接获取public修饰的空参数的构造方法并运行。前提必须保证存在这样的方法。

  C、获取普通方法:

    Class类中Method[] getMathods() 返回字节码文件中的方法,这些方法是public修饰的,包括继承的和实现的方法。        

    Class类中Method getMethod(String 方法名,Class...c)返回一个方法,传递方法名和参数列表

    Class类中getDeclareMethod(String 方法名,Class...c)可以获取私有的构造方法

    运行普通方法:

    Method类中Object invoke(Object o对象,Object...args方法中的参数)

 

4、运用反射实现泛型的临时擦除

 1 import java.util.*;
 2 import java.lang.reflect.*;
 3 public class ListDemo {
 4     public static void main(String[] args) throws Exception{
 5 
 6         ArrayList<String> array = new ArrayList<String>();
 7         array.add("asdf");
 8         array.add("dgfer");
 9         //获取ArrayList类的字节码文件对象
10         Class clazz = array.getClass();
11         //获取添加方法add
12         Method method = clazz.getMethod("add", Object.class);
13         method.invoke(array, 123);
14         method.invoke(array, 12.34);
15         method.invoke(array, true);
16         System.out.println(array);
17         Iterator it = array.iterator();
18         while(it.hasNext()){
19             System.out.println(it.next());
20         }
21     }
22 }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!