Java反射机制学习–1

Java反射机制详解—-感谢该博主提供内容以供学习

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

package net.xsoftlab.baike;
public class TestReflect {
    public static void main(String[] args) throws Exception {
        TestReflect testReflect = new TestReflect();
        System.out.println(testReflect.getClass().getName());
    }
}

通过上面这个程序获取了类的正确名称,进行下一个实例测试。

package net.xsoftlab.baike;
public class TestReflect {
    public static void main(String[] args) throws Exception {
        Class<?> class1 = null;
        Class<?> class2 = null;
        Class<?> class3 = null;
        // 一般采用这种形式
        class1 = Class.forName("net.xsoftlab.baike.TestReflect");
        class2 = new TestReflect().getClass();
        class3 = TestReflect.class;
        System.out.println("类名称   " + class1.getName());
        System.out.println("类名称   " + class2.getName());
        System.out.println("类名称   " + class3.getName());
    }
}

这个程序依旧能够正确打印类名,但是我不知道三者之间的差异,进行更深层次的测试。

package com.azrael.p;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
        Class<?> class1 = null;
        Class<?> class2 = null;
        Class<?> class3 = null;

        class1 = Class.forName("com.azrael.p.ClassA");
        class2 = new ClassA().getClass();
        class3 = ClassA.class;

        System.out.println(class1.getName());
        System.out.println(class2.getName());
        System.out.println(class3.getName());
    }
}

在这里我将需要创建的类更改为另外一个类,在同一包目录下,可以正确运行,将这个类移动到另外的包后,
编译期出错,IDE提示报错,具体是对应class2以及class3无法正确获取类名。
考虑到可能是没有指定路径,进行了如下更正。

        class1 = Class.forName("com.azrael.p1.ClassA");
        class2 = new com.azrael.p1.ClassA().getClass();
        class3 = com.azrael.p1.ClassA.class;

可以正确显示了,但是相对于class1的生成方式只需要获取类地址的字符串即可正确创建类,其他两种方式都是硬编码方式进行创建,所以个人建议最好使用第一种即用Class.forName()方式创建。
这也正好和之前学习Struts2时需要在配置文件中正确配置类路径呼应,想必Struts2获取类的方法也是需要正确的类路径然后使用Class.forName()方式拿到类对象。

发表评论

您的电子邮箱地址不会被公开。