反射基础
Class类
铺垫动态代理
反射其他文章
傻瓜教你反射(二) ---- Constructor
傻瓜教你反射(三) ---- Field
傻瓜教你反射(四) ---- Method
1.定义
Java中,每个class都有一个相应的Class对象
(一个类->编译完成->生成的.class文件->产生一个Class对象——用于表示这个类的类型信息)
Class类是一个final类
2.获取Class实例
1)创建一个简单的A类
package com.company;
public class A{
private String s;
public int b;
public A(){
System.out.println("A类无参数构造");
}
public A(String s){
System.out.println("A类有参数构造:s:"+s);
}
private A(int a){
System.out.println("A类有参数 私有构造:a:"+a);
}
public void show(){
}
}
2)如何获得类A的Class实例
package com.company;
public class Reflect {
public static void main(String[] args) throws ClassNotFoundException {
/**
* 1.使用类的对象获取
* 每个类都使用Object作为父类
* Object类方法getClass()返回这个类的class文件对象
* 方法返回值Class类型对象
*/
A a = new A();
Class classa = a.getClass();
System.out.println(classa);
/**
* 2.使用类的静态属性获取
* 类名.class 返回这个类的class文件对象.属性
* 运行结果也是Class类型对象
*/
Class classb = A.class;
System.out.println(classb);
/**
* 3.使用Class类的静态方法获取
* Class类静态方法forName(String类名)[注意:全类名]
* 传递字符串类名获取到这个类的class文件对象
* 方法返回值也是Class类型对象
*/
Class classc;
classc = Class.forName("com.company.A");//括号内需要一个字符串,所以要加引号
System.out.println(classc);
System.out.println(classa == classb);
System.out.println(classb == classc);
}
}
- 运行结果
A类无参数构造
class com.company.A
class com.company.A
class com.company.A
true
true
3.总结
方式 | 使用范围 |
---|---|
getClass() | 需要获取对象实例,仅能用于引用类型 |
.class | 无需获取对象实例,既可以是引用类型也可以是基本类型 |
forName() | 只需要类的全限定名 |
基本类型(基本数据类型):
byte
int
short
long
float
double
char
boolean
;
引用类型:(除上述基本类型外,剩下的即为引用类型)引用类型是一种对象类型,它的值是指向内存空间的引用,就是地址
。Java有 5种引用类型(对象类型):类
接口
数组
枚举
标注
。
4.补充
基本类型获取Class实例,除了使用.Class,还可以通过基本类型的包装类的TYPE字段:
Class a = Double.TYPE;
Class b = Void.TYPE;
5.提问
Q1
为什么基本类型无法用第一种和第三种方法获取?
Q2
boolean怎么获取Class吗?
Q3
Class c = System.console().getClass();对吗?
(答案在文章末尾,嘻嘻~)
6.铺垫
java.lang.Class是所有反射操作的的入口,举例:
getSupperClass() :返回指定的父类
Class.getClasses() :获取所有内部所有public类,接口,枚举,包括本身和继承的成员类。
Class.getClassLoader() :每个class都有一个reference,指向自己的ClassLoader
/**
* 使用Class中的API
*/
Class cls = A.class//获取Class实例
Object object = cls.getSupperClass();//以Class的实例为入口,使用其中的方法来获得A类的父类
A1
因为第一种.getClass()基于每个类都使用Object作为父类,Object类方法getClass()返回这个类的class文件对象,但是基本类型是原生类型,并没有Object作为父类
A2
boolean是原生类型,只能使用第二种方法获取Class实例,Class bl = boolean.class或者用补充的方法 Class bl2 = boolean.TYPE
A3
正确,因为System.console()返回的是一个实例化对象(且不是原生类型(基本类型)的实例化对象)