Reflector、ReflectorFactory的前世
前世
2023-09-14 09:14:05 时间
一、如何获得Class对象
1、Class.forName(“类的全限定名”)
2、实例对象.getClass()
3、类名.class (类字面常量)
实验代码:
@Slf4j
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException {
// 1、获取class对象
Class childrenClass = Children.class;
log.info("class={}", childrenClass);
Class forName = Class.forName("com.ceam.coll.clazz.Children");
log.info("class={}", forName);
Children children = new Children(18);
Class childrenClass1 = children.getClass();
log.info("class={}", childrenClass1);
}
}
class Father {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Children extends Father{
private String name;
private Integer age;
public Children(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
实验结果:
二、Class类的方法
方法 | 说明 |
forName() | (1)获取Class对象的一个引用,但引用的类还没有加载(该类的第一个对象没有生成)就加载了这个类。 (2)为了产生Class引用,forName()立即就进行了初始化。 |
getClass() | 获取Class对象的一个引用,返回表示该对象的实际类型的Class引用。 |
getName() | 取全限定的类名(包括包名),即类的完整名字。 |
getSimpleName() | 获取类名(不包括包名) |
getCanonicalName() | 获取全限定的类名(包括包名) |
isInterface() | 判断Class对象是否是表示一个接口 |
getInterfaces() | 返回Class对象数组,表示Class对象所引用的类所实现的所有接口。 |
getSupercalss() | 返回Class对象,表示Class对象所引用的类所继承的直接基类。应用该方法可在运行时发现一个对象完整的继承结构。 |
newInstance() | 返回一个Oject对象,是实现“虚拟构造器”的一种途径。使用该方法创建的类,必须带有无参的构造器。 |
getFields() | 获得某个类的所有的公共(public)的字段,包括继承自父类的所有公共字段。 类似的还有getMethods和getConstructors。 |
getDeclaredFields | 获得某个类的自己声明的字段,即包括public、private和proteced,默认但是不包括父类声明的任何字段。类似的还有getDeclaredMethods和getDeclaredConstructors。 |
1、getName()取全限定的类名(包括包名),即类的完整名字。
String name = childrenClass.getName();
log.info("name = {}", name);
10:27:13.381 [main] INFO com.ceam.coll.clazz.ClassTest - name = com.ceam.coll.clazz.Children
2、getSimpleName()获取类名(不包括包名)
String simpleName = childrenClass.getSimpleName();
log.info("simpleName = {}", simpleName);
10:27:13.381 [main] INFO com.ceam.coll.clazz.ClassTest - simpleName = Children
3、getCanonicalName()获取全限定的类名(包括包名)
Class innerClass = innerClass.class;
String canonicalName = innerClass.getCanonicalName();
log.info("canonicalName = {}", canonicalName);
String name1 = innerClass.getName();
log.info("name = {}", name1);
}
static class innerClass {
}
10:35:50.488 [main] INFO - canonicalName = com.ceam.coll.clazz.ClassTest.innerClass
10:35:50.488 [main] INFO - name = com.ceam.coll.clazz.ClassTest$innerClass
4、getInterfaces()返回Class对象数组,表示Class对象所引用的类所实现的所有接口。
Class[] interfaces = childrenClass.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
log.info("interfaces = {}", interfaces[i]);
}
class Children extends Father implements if1,if2 {
private String name;
private Integer age;
public Children(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
interface if1 {
}
interface if2 {
}
11:01:22.007 [main] INFO - interfaces = interface com.ceam.coll.clazz.if1
11:01:22.007 [main] INFO - interfaces = interface com.ceam.coll.clazz.if2
5、getSupercalss()返回Class对象,表示Class对象所引用的类所继承的直接基类
Class superclass = childrenClass.getSuperclass();
log.info("superclass = {}", superclass);
11:04:22.283 [main] INFO com.ceam.coll.clazz.ClassTest - superclass = class com.ceam.coll.clazz.Father
6、newInstance()返回一个Oject对象,是实现“虚拟构造器”的一种途径。使用该方法创建的类,必须带有无参的构造器。
Children instance1 = (Children)childrenClass.newInstance();
Father instance2 = (Children)childrenClass.newInstance();
Father instance3 = (Father)childrenClass.newInstance();
log.info("instance = {}", instance1);
log.info("instance = {}", instance2);
log.info("instance = {}", instance3);
11:11:24.919 [main] INFO com.ceam.coll.clazz.ClassTest - instance = com.ceam.coll.clazz.Children@48533e64
11:11:24.919 [main] INFO com.ceam.coll.clazz.ClassTest - instance = com.ceam.coll.clazz.Children@64a294a6
11:11:24.919 [main] INFO com.ceam.coll.clazz.ClassTest - instance = com.ceam.coll.clazz.Children@7e0b37bc
7、getFields()获得某个类的所有的公共(public)的字段,包括继承自父类的所有公共字段。 类似的还有getMethods和getConstructors。
Field[] fields = childrenClass.getFields();
for (int i = 0; i < fields.length; i++) {
log.info("fields = {}", fields[i]);
log.info("fields name = {}", fields[i].getName());
log.info("fields type = {}", fields[i].getType());
log.info("fields Modifiers = {}", fields[i].getModifiers());
log.info("fields GenericType = {}", fields[i].getGenericType());
log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
- fields = public java.lang.String com.ceam.coll.clazz.Children.name
- fields name = name
- fields type = class java.lang.String
- fields Modifiers = 1
- fields GenericType = class java.lang.String
- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- fields = public java.lang.Integer com.ceam.coll.clazz.Children.age
- fields name = age
- fields type = class java.lang.Integer
- fields Modifiers = 1
- fields GenericType = class java.lang.Integer
- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- fields = public java.lang.String com.ceam.coll.clazz.Father.money
- fields name = money
- fields type = class java.lang.String
- fields Modifiers = 1
- fields GenericType = class java.lang.String
- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
8、getDeclaredFields()获得某个类的自己声明的字段,即包括public、private和proteced,默认但是不包括父类声明的任何字段。类似的还有getDeclaredMethods和getDeclaredConstructors。
Field[] declaredFields = childrenClass.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
log.info("declaredFields = {}", declaredFields[i]);
}
11:22:44.298 [main] INFO - declaredFields = public java.lang.String com.ceam.coll.clazz.Children.name
11:22:44.298 [main] INFO - declaredFields = public java.lang.Integer com.ceam.coll.clazz.Children.age
11:22:44.299 [main] INFO - declaredFields = private java.lang.String com.ceam.coll.clazz.Children.grilFrined
9、getDeclaredMethods()获取自己声明的所有非构造方法(包括父类被重写的方法)。
Method[] declaredMethods = childrenClass.getDeclaredMethods();
for (int i = 0; i < declaredMethods.length; i++) {
log.info("declaredMethods = {}", declaredMethods[i]);
log.info("declaredMethods name = {}", declaredMethods[i].getName());
log.info("declaredMethods returnType = {}", declaredMethods[i].getReturnType());
log.info("declaredMethods parameterTypes = {}", declaredMethods[i].getParameterTypes());
log.info("declaredMethods parameterCount = {}", declaredMethods[i].getParameterCount());
log.info("declaredMethods parameters = {}", declaredMethods[i].getParameters());
log.info("*************************************************************************{}");
}
class Children extends Father implements if1,if2 {
public String name;
public Integer age;
private String girlFriend;
Children() {
}
public Children(String girlFriend, Integer age) {
this.age = age;
this.girlFriend = girlFriend;
}
public Children age(Integer age) {
this.age = age;
return this;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private void love(GirlFriend girlFriend) {
}
private class GirlFriend {
}
}
- declaredMethods = public java.lang.String com.ceam.coll.clazz.Children.getName()
- declaredMethods name = getName
- declaredMethods returnType = class java.lang.String
- declaredMethods parameterTypes = {}
- declaredMethods parameterCount = 0
- declaredMethods parameters = {}
- *************************************************************************
- declaredMethods = public void com.ceam.coll.clazz.Children.setName(java.lang.String)
- declaredMethods name = setName
- declaredMethods returnType = void
- declaredMethods parameterTypes = class java.lang.String
- declaredMethods parameterCount = 1
- declaredMethods parameters = java.lang.String name
t - *************************************************************************
- declaredMethods = public java.util.List com.ceam.coll.clazz.Children.money()
- declaredMethods name = money
- declaredMethods returnType = interface java.util.List
- declaredMethods parameterTypes = {}
- declaredMethods parameterCount = 0
- declaredMethods parameters = {}
- *************************************************************************
- declaredMethods = public java.util.ArrayList com.ceam.coll.clazz.Children.money()
- declaredMethods name = money
- declaredMethods returnType = class java.util.ArrayList
- declaredMethods parameterTypes = {}
- declaredMethods parameterCount = 0
- declaredMethods parameters = {}
- *************************************************************************
- declaredMethods = public com.ceam.coll.clazz.Children com.ceam.coll.clazz.Children.age(java.lang.Integer)
- declaredMethods name = age
- declaredMethods returnType = class com.ceam.coll.clazz.Children
- declaredMethods parameterTypes = class java.lang.Integer
- declaredMethods parameterCount = 1
- declaredMethods parameters = java.lang.Integer age
- *************************************************************************
- declaredMethods = private void com.ceam.coll.clazz.Children.love(com.ceam.coll.clazz.Children$GirlFriend)
- declaredMethods name = love
- declaredMethods returnType = void
- declaredMethods parameterTypes = class com.ceam.coll.clazz.Children$GirlFriend
- declaredMethods parameterCount = 1
- declaredMethods parameters = com.ceam.coll.clazz.Children$GirlFriend girlFriend
- *************************************************************************
10、getDeclaredConstructors()获取自己声明的所有构造方法。
Constructor[] declaredConstructors = childrenClass.getDeclaredConstructors();
for (int i = 0; i < declaredConstructors.length; i++) {
log.info("declaredConstructors = {}", declaredConstructors[i]);
}
- declaredConstructors = com.ceam.coll.clazz.Children()
- declaredConstructors = public com.ceam.coll.clazz.Children(java.lang.String,java.lang.Integer)
11、代码清单
@Slf4j
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
// 1、获取class对象
Class childrenClass = Children.class;
log.info("class = {}", childrenClass);
Class forName = Class.forName("com.ceam.coll.clazz.Children");
log.info("class = {}", forName);
Children children = new Children();
Class childrenClass1 = children.getClass();
log.info("class = {}", childrenClass1);
// 2、
String name = childrenClass.getName();
log.info("name = {}", name);
String simpleName = childrenClass.getSimpleName();
log.info("simpleName = {}", simpleName);
Class[] interfaces = childrenClass.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
log.info("interfaces = {}", interfaces[i]);
}
Class superclass = childrenClass.getSuperclass();
log.info("superclass = {}", superclass);
Children instance1 = (Children)childrenClass.newInstance();
Father instance2 = (Children)childrenClass.newInstance();
Father instance3 = (Father)childrenClass.newInstance();
log.info("instance = {}", instance1);
log.info("instance = {}", instance2);
log.info("instance = {}", instance3);
Field[] fields = childrenClass.getFields();
for (int i = 0; i < fields.length; i++) {
log.info("fields = {}", fields[i]);
log.info("fields name = {}", fields[i].getName());
log.info("fields type = {}", fields[i].getType());
log.info("fields Modifiers = {}", fields[i].getModifiers());
log.info("fields GenericType = {}", fields[i].getGenericType());
log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
Field[] declaredFields = childrenClass.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
log.info("declaredFields = {}", declaredFields[i]);
}
Method[] declaredMethods = childrenClass.getDeclaredMethods();
for (int i = 0; i < declaredMethods.length; i++) {
log.info("declaredMethods = {}", declaredMethods[i]);
log.info("declaredMethods name = {}", declaredMethods[i].getName());
log.info("declaredMethods returnType = {}", declaredMethods[i].getReturnType());
log.info("declaredMethods parameterTypes = {}", declaredMethods[i].getParameterTypes());
log.info("declaredMethods parameterCount = {}", declaredMethods[i].getParameterCount());
log.info("declaredMethods parameters = {}", declaredMethods[i].getParameters());
log.info("*************************************************************************");
}
Constructor[] declaredConstructors = childrenClass.getDeclaredConstructors();
for (int i = 0; i < declaredConstructors.length; i++) {
log.info("declaredConstructors = {}", declaredConstructors[i]);
}
Class innerClass = innerClass.class;
String canonicalName = innerClass.getCanonicalName();
log.info("canonicalName = {}", canonicalName);
String name1 = innerClass.getName();
log.info("name = {}", name1);
}
static class innerClass {
}
}
class Father {
private String name;
public String money;
public List<String> money() {
return null;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Children extends Father implements if1,if2 {
public String name;
public Integer age;
private String girlFriend;
Children() {
}
public Children(String girlFriend, Integer age) {
this.age = age;
this.girlFriend = girlFriend;
}
public Children age(Integer age) {
this.age = age;
return this;
}
public ArrayList<String> money() {
return null;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private void love(GirlFriend girlFriend) {
}
private class GirlFriend {
}
}
interface if1 {
}
interface if2 {
}
相关文章
- 一文吃透ThreadLocal的前世与今生
- 一文吃透ConcurrentHashMap的前世与今生
- Spring异步核心@Async注解的前世今生
- 前世的五百次回眸,才换来今生的擦肩而过。大佬,您只管努力,"CSS" 交给 "它"
- ITPUB专访 | 低代码的前世今生
- 万物互联 | 二维码的前世今生
- Ajax是技术还是框架?走进Ajax的前世今生
- 元宇宙的前世今生,业内大佬带你一遍过!
- MySQL Hash Join前世今生
- 知识科普 | “计算机病毒-数据安全的致命威胁”系列科普(一)计算机病毒的前世今生
- 319篇文献、41页综述文章讲述图神经网络用于医疗诊断的前世今生与未来
- VAE 的前世今生:从最大似然估计到 EM 再到 VAE
- 验证码的前世今生(今生篇)
- 验证码的前世今生(前世篇)
- 逆向Linux CAD逆向分析的前世今生(linuxcad)