JAVA反射机制--实例化Class类的三种方式及区别

在Object类中定义了以下的方法,此方法将被所有子类继承:
 public final Class getClass()
 以上方法返回值的类型是一个Class类,实际上此类是Java反射的源头,
 实际上所谓反射从程序的运行结果来看也很好理解,即:
 可以通过对象反射求出类的名称
 正常方式:引入需要的包、类名称,通过new实例化,取得实例化对象
 反射方式:实例化对象,getClass()方法,取得完整的包、类名称

实例化Class类对象的方法有三种:
 1.通过forName()方法
 2.类.class
 3.对象.getClass()

package com.testClass;
class XX{
};
public class demo02 {
    public  static void main(String args[]){
        Class c1= null;//指定泛型
        Class c2= null;
        Class c3= null;
        try {
            //方法1:推荐使用
            c1 = Class.forName("com.testClass.XX");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("c1:"+c1.getName());
        //方法2
        c2 = new XX().getClass();
        System.out.println("c2:"+c2.getName());
        //方法3
        c3 = XX.class;
        System.out.println("c3:"+c3.getName());
    }
}

输出结果:

c1:com.testClass.XX
c2:com.testClass.XX
c3:com.testClass.XX

Class.forName():如果知道类的全名,则可以使用静态方法Class.forName()来获得Class对象。它不能用在原始类型上,但是可以用在原始类型数组上。

Object.getClass():如果一个类的对象可用,则最简单的获得Class的方法是使用Object.getClass()。当然,这种方式只对引用类型有用。

.class语法:如果类型可用但没有对象,则可以在类型后加上“.class”来获得Class对象。这也是使原始类型获得Class对象的最简单的方式。

为什么推荐使用Class.forName()

Object.getClass()对象都有了还要用反射意义不大。

类.class需要导入类的包,依赖太强,不导包就抛编译错误

Class.forName()一个字符串可以传入也可写入配置文件中等。

你可能感兴趣的:(java)