首页 > 代码库 > 黑马程序员_反射

黑马程序员_反射

 

反射

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         //获取添加方法add12         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 }

 

黑马程序员_反射