java反射与new_java反射与注解(一):Class类简介

本文介绍了Java中的Class类,它是反射的重要组成部分。通过Class对象,我们可以动态获取类信息,如属性、方法和构造器,实现动态创建对象等功能。文章详细讲解了通过对象、类名.class和Class.forName()获取Class对象的方法,以及newInstance()方法用于实例化对象。同时,提到了Class对象用于访问Field、Method和Constructor的相关API。
摘要由CSDN通过智能技术生成

Class类简介

Cass类位于jdk的java.lang包下

928e2f9daf8a

虽然不在反射包下面,但是类中import了很多反射的类

928e2f9daf8a

所以和反射有很大关系

反射,在平时使用中,不是很多。

但是,在一些特殊的地方,通常有一定的好处

例如,动态去获取值,动态得到对象,调用方法,或者调用别人类中private的方法等

当然,还有很多其他的好处

里面有对应的ClassLoader, 以及 native的jni理解 ,

由于个人能力问题,我们掠过ClassLoader和Class中的jni理解

具体调用

通常分为2种类型,3中写法

如果有对象,可以获取这个对象Class类中的信息

例如:

Class> c1 = new DummyClass().getClass();

如果没有对象,可以通过

Class> c2 = DummyClass.class;

或者(下面这种需要try,catch)

Class> c3 = Class.forName("xxx.xxx.DummyClass");

Class类型,简单例子

比如,这里我们写了一个DummyClass,里面就只有name,age对应的2个属性

再写了setter,getter,toString方法

我们用几种方式去获得对应的Class对象,再打印getName方法

对象的方式

Class> c1 = new DummyClass().getClass();

System.out.println(c1.getName());

我们发现,可以得到对应的Class对象,并且打印

com.aohuan.dodo.javacode.reflect.utils.DummyClass

类名.class方式

c1 = DummyClass.class;

System.out.println(c1.getName());

我们发现,可以得到对应的Class对象,并且打印

com.aohuan.dodo.javacode.reflect.utils.DummyClass

Class.forName("完整类名")的方式

try {

c1 = Class.forName("com.aohuan.dodo.javacode.reflect.utils.DummyClass");

System.out.println(c1.getName());

} catch (Exception e) {

e.printStackTrace();

}

我们发现,可以得到对应的Class对象,并且打印

com.aohuan.dodo.javacode.reflect.utils.DummyClass

newInstance()方法

上面的3种方式,其实Class,只是对应类型

我们如果要初始化对象

可以用Class的newInstance()方法实例化对象

比如,上面的c1

实例化代码,大体为:

try {

DummyClass bean11 = new DummyClass().getClass().newInstance();

System.out.println(bean11);

} catch (InstantiationException e1) {

e1.printStackTrace();

} catch (IllegalAccessException e1) {

e1.printStackTrace();

}

我们运行后,打印为:

DummyClass{age=0, name='null'}

也就是,DummyClass类中的toString方法,只是field没有赋值,所以都是null

注意,这里DummyClass做了toString方法的复写

Class属性认识

我们看一下,对应的一些属性

private native Field[] getDeclaredFields0(boolean publicOnly);

private native Method[] getDeclaredMethods0(boolean publicOnly);

private native Constructor[] getDeclaredConstructors0(boolean publicOnly);

private native Class>[] getDeclaredClasses0();

其实,我们大体可以看见,对应的native属性

Field[] :对应的属性(字段)

Method[] : 对应的方法

Constructor[] : 对应泛型类T的构造函数

Class>[] : 声明的类

具体获取,可以通过Class对象的方法获得

Field:

getFields() : 获取 包括父类的public的 Field[]

getDeclaredFields() : 获取 本类所有的 Field[]

getField(name) : 根据 名字,获取包括父类具体的public Field

getDeclaredField(name) :根据名字,获取本类Field

Method:

getMethods() : 获取 包括父类的 public的Method[](public)

getDeclaredMethod() : 获取 本类中所有的 Method[]

getMethod(name, parameterTypes) : 根据 名字,参数类型(可变参数), 获取具体 Method(public)

getDeclaredMethod(name, parameterTypes) : 根据 名字,参数类型(可变参数), 获取具体 Method

Constructor:

getConstructors() : 获取 包括父类的所有public的 Constructor[]

getDeclaredConstructors() : 获取 本类所有的 Constructor[]

getConstructor(parameterTypes) : 根据 参数类型(可变参数), 获取具体 Constructor(public)

getDeclaredConstructor(parameterTypes):根据 参数类型(可变参数), 获取具体 Constructor

其他

当然,除了常见的 属性 Field,方法 Method,构造 Constructor

Class还会操作 注解

例如:

Class对象的

getAnnotation(annotationClass)

getAnnotations()

getDeclaredAnnotations()

简单总结

这里大致了解下

Class的简单使用 和 大体作用

其他的内容,后续一起学习具体代码,可以见

https://github.com/2954722256/use_little_demo

对应 javacode 的 Module,对应的reflect包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值