Class类是Reflection API中核心的类,他位于java.lang.Class
列出一些常用的方法。
- getName() : 获得类的完整名字
- getFields() : 获得类的public类型的属性
- getDeclaredFields() : 获得类的所有属性
- getMethods() : 获得类的public类型的方法
- getDeclaredMethods() : 获得类的所有方法
- getMethod(String name, Class[] parameterTypes) : 获取类的特定方法(name参数指定方法名字,parameterTypes参数指定方法参数类型)
- getConstructors() : 获得类的public类型的构造方法
- getConstructor(Class[] parameterTypes) : 获得类的特定构造方法(parameterTypes参数指定构造方法的参数类型)
- newInstance() : 通过类的不带参数的构造方法创建这个类的一个对象
如果想使用反射,有2个关键的部分
1.获取Class对象
2.获得对象实例
下面来介绍这两个部分:
1.如何获取Class对象
获取某个类或某个对象所对应的Class对象的常用的3种方法
a) 使用Class类的静态方法forName:
Class.forName("java.lang.String");
b) 使用类的.class语法:
String.class;
c) 使用对象的getClass()方法(java.lang.Object类中的方法):
String s = "aa";
Class<?> clazz = s.getClass();
2.如何获得对象实例
大家都知道获得对象实例就是去new一个,其实就是调用对象的构造方法
这里将调用构造方法参数的不同分为两种类型:
a)调用无参数的构造方法:
1.调用Class对象的newInstance()方法:
Class<?> classType = ClassClass.forName("java.lang.String");
Object object = classTpye.newInstance();
2.调用Class对象的Constructor对象的newInstance()方法,传递一个空的Class对象数组作为参数:
Class<?> classType = ClassClass.forName("java.lang.String");
Constructor cons = classType.getConstructor(new Class[]{});
Object object =cons.newInstance(new Object[]{});
b)调用有参数的构造方法:
1.调用Class对象的Constructor对象的newInstance()方法,传递一个可变长的Class对象数组作为参数,本例传递String,int两个参数:
Class<?> classType = ClassClass.forName("java.lang.String");
Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});
Object object = cons.newInstance(new Object[]{"hello",3});
下面来一个小Demo,由于过于简单这里就只贴代码了
这个demo简单的实现了上面介绍的一些关于反射的用法,算是一个复习巩固:
package com.hwcode.pojo;
public class Person {
private String userName;
private String userAge;
private String userAddress;
private String userAuto;
public Person(){}
public Person(String userName, String userAge, String userAddress, String userAuto) {
this.userName = userName;
this.userAge = userAge;
this.userAddress = userAddress;
this.userAuto = userAuto;
}
@Override
public String toString() {
return "Person [userName=" + userName + ", userAge=" + userAge + ", userAddress=" + userAddress + ", userAuto="
+ userAuto + "]";
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAge() {
return userAge;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
public String getUserAuto() {
return userAuto;
}
public void setUserAuto(String userAuto) {
this.userAuto = userAuto;
}
private void getUserNameAndUserAge(){
System.out.println("userName : " + this.userName + "\nuserAge : " + this.userAge);
}
}
很简单的一个自定义类,两个构造方法,和一些get,set方法,还有一个重写的toString
下面是调用反射的main方法中的代码,主要就是用反射的方法调用Person的带参构造方法给age,name赋值,在调用setId给id赋值,最后调用toString方法打印出结果
package com.hwcode.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) {
try {
// 构造方法不是私有用以下方法
// Person person = new Person();
// Class<? extends Person> personClass = person.getClass();
// 构造方法私有用以下方法
// 获取Person类的Class对象
Class<?> classType = Class.forName("com.hwcode.pojo.Person");
Constructor constructor = classType
.getConstructor(new Class[] { String.class, String.class, String.class, String.class });
Object object = constructor.newInstance(new Object[] { "Dean", "25", "我的住址", "阳光帅气" });
// 获取setUserName方法
Method setId = classType.getMethod("setUserName", new Class[] {String.class });
// 调用setUserName方法设置UserName
setId.invoke(object, new Object[] { "凯文" });
// 调用toString输出结果
Method toString = classType.getMethod("toString", new Class[] {});
String result = (String) toString.invoke(object, new Object[] {});
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果为:Person [userName=凯文, userAge=25, userAddress=我的住址, userAuto=阳光帅气]
最近正在看反射的视频和资料,写这个博文的目的就是对于学习的一个总结吧。
陆续可能会更新一些我总结的更深层的反射知识,希望大家支持