Java-反射

 Java反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
 java

一、关于Class

    一、Class是一个类,一个描述类的类(也就是描述类自己),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性
    二、对象照镜子后(反射)能够获得的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。
    三、对于每一个类而言,JRE 都为其保留一个不变的 Class 类型的对象。
        一个 Class 对象包含了特定某个类的有关信息。
    四、Class 对象只能由系统创建对象
    五、一个类在 JVM 中只会有一个Class实例测试

/** 
 * 反射机制获取类有三种方法 
 */  
@Test  
public void testGetClass() throws ClassNotFoundException {  
    Class clazz = null;  
  
    //1 直接经过类名.Class的方式获得  
    clazz = Person.class;  
    System.out.println("经过类名: " + clazz);  
  
    //2 经过对象的getClass()方法获取,这个使用的少(通常是传的是Object,不知道是什么类型的时候才用)  
    Object obj = new Person();  
    clazz = obj.getClass();  
    System.out.println("经过getClass(): " + clazz);  
  
    //3 经过全类名获取,用的比较多,但可能抛出ClassNotFoundException异常  
    clazz = Class.forName("com.java.reflection.Person");  
    System.out.println("经过全类名获取: " + clazz);  
}

三、利用newInstance建立对象:调用的类必须有无参的构造器

/** 
 * Class类的newInstance()方法,建立类的一个对象。 
 */  
@Test  
public void testNewInstance()  
        throws ClassNotFoundException, IllegalAccessException, InstantiationException {  
  
    Class clazz = Class.forName("com.java.reflection.Person");  
  
    //使用Class类的newInstance()方法建立类的一个对象  
    //实际调用的类的那个 无参数的构造器(这就是为何写的类的时候,要写一个无参数的构造器,就是给反射用的)  
    //通常的,一个类若声明了带参数的构造器,也要声明一个无参数的构造器  
    Object obj = clazz.newInstance();  
    System.out.println(obj);  
}

/** 
 * ClassLoader类装载器 
 */  
@Test  
public void testClassLoader1() throws ClassNotFoundException, IOException {  
    //一、获取一个系统的类加载器  
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();  
    System.out.println("系统的类加载器-->" + classLoader);  
  
    //二、获取系统类加载器的父类加载器(扩展类加载器(extensions classLoader))  
    classLoader = classLoader.getParent();  
    System.out.println("扩展类加载器-->" + classLoader);  
  
    //三、获取扩展类加载器的父类加载器  
    //输出为Null,没法被Java程序直接引用  
    classLoader = classLoader.getParent();  
    System.out.println("启动类加载器-->" + classLoader);  
  
    //  
  
    //四、测试当前类由哪一个类加载器进行加载 ,结果就是系统的类加载器  
    classLoader = Class.forName("com.java.reflection.Person").getClassLoader();  
    System.out.println("当前类由哪一个类加载器进行加载-->"+classLoader);  
  
    //五、测试JDK提供的Object类由哪一个类加载器负责加载的  
    classLoader = Class.forName("java.lang.Object").getClassLoader();  
    System.out.println("JDK提供的Object类由哪一个类加载器加载-->" + classLoader);  
}
系统的类加载器-->sun.misc.Launcher$AppClassLoader@43be2d65 扩展类加载器-->sun.misc.Launcher$ExtClassLoader@7a9664a1 启动类加载器-->null 当前类由哪一个类加载器进行加载-->sun.misc.Launcher$AppClassLoader@43be2d65 JDK提供的Object类由哪一个类加载器加载-->null
相关文章
相关标签/搜索