获得Class类对象的几种方法

Python010

获得Class类对象的几种方法,第1张

每一个class都有一个Class对象。一个java文件经过编译,再生成的.class文件中,就会创建一个Class对象。只有一个。他表示整个类的类型信息。

那么通常我们创建对象的方式又有几种呢?

五种:

1.通过new 语句创建对象。

2.通过静态工厂方法创建,比如A.getNewInstance()

3.通过反射技术来实现。可以调用Class类或Constructor类的newInstance()方法。

4.通过调用对象的clone()方法

5.利用I/O流技术的反序列化来实现。

回归正题获取Class对象(实例)有三种方法:

1.通过class的方式创建Class实例:类名.class

2.通过对象的getClass()方法获得。

3.通过Class类的forName()方法来获得。

反射:可以说是一中技术手段,利用反射可以访问,检测,修改本身行为状态的一种方式。利用反射我们可以创建实例。

其实质就是:反编译:.class---反编译成.java文件。

所以说他是一个强大的工具,他可以创建更加灵活的代码,在运行期装配。使我们可以在运行期,动态的访问对象有哪些方法,动态,并可以为修改对象的属性,在运行期动态的访问任何对象的任何方法。

而且他降低了代码的耦合度,提高了可扩展性。

但是反射使用不当会成本很高。而且反射本身比直接硬编码更加复杂,所以一般性小程序尽量不要用,他适合一些对灵活度和可扩展性比较强的框架中。

而且他会模糊程序结构,不利于理解程序流程。可维护性不好。

java中创建对象时其实不是通过类直接创建的,如果你想要使用Test类,在java中JVM首先加载Test.java文件的字节码文件Test.class(也就是编译后的文件),当JVM(java虚拟机)加载字节码文件后,自动为该类创建自己的class对象,在通过class对象创建你以后要创建的对象\x0d\x0a例如:Test t1=new Test() Test t2=new Test() 我们都知道java中 == 是比较两个对象的内存地址,t1.getClass()==t2.getClass()返回是true,证明他们是一个class对象创建出来的。那么可Class对象的意义就是标志一个类了,Class类为我们提供了很多方法,比如反射技术常用到的Class.forName("包.类")这样可以获取一个类的Class对象。\x0d\x0a例如:Test类在org.abc这个包里,那么可以用Class.forName("org.abc.Test")这样就返回一个Test类的class对象,拿到这个对象接下来可以做很多事,调用这个类的方法,属性,构造方法等,具体你去研究下反射技术。如果有不懂在问我。\x0d\x0a针对一种数据类型的Class转换,比如String.class,int.class,类.class等\x0d\x0a你提出的问题Class参数,就是让你传一种Class对象进去。比如String.class,int.class,类.class等\x0d\x0aTest.class==t1.getClass()返回true,怕你有误解,说明一下类和对象都可以获取class对象的。并且这个对象是一个对象,因为一个类对应自己的class对象。

public static Object getType(Class c) throws Exception{

    Field f = c.getDeclaredField("TYPE")

    Object obj = f.get(c)

    return obj

}

public static void main(String[] args) throws Exception {

    System.out.println(getType(Integer.class))

}