反射机制
反射指对象的反向处理操作,所谓的反向处理指的是根据对象来获取对象的来源信息
调用Object类提供的getClass()方法:
public final native Class<?> getClass();
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date.getClass());//通过对象取得类的信息
}
}
反射实例化对象
反射举例:
public class Test{
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class<?> cls = Class.forName("java.util.Date");
Object obj = cls.newInstance();//相当于new java.util.Date();
System.out.println(obj);
}
}
反射与类操作
取得父类信息:
1、取得包名称
//取得包名称
public static void main(String[] args) {
Class<?> cls = CLS.class ; // 取得Class类对象
System.out.println(cls.getPackage().getName());
}
2、取得实现的父接口对象
//取得父类
public static void main(String[] args) {
Class<?> cls = CLS.class ; // 取得Class类对象
// 取得Package名称
System.out.println(cls.getPackage().getName());
// 取得父类名称
System.out.println(cls.getSuperclass().getName());
// 取得实现的父接口对象
Class<?>[] iClass = cls.getInterfaces() ;
for (Class<?> class1 : iClass) {
System.out.println(class1.getName());
}
}
3、反射调用构造方法
//反射调用构造方法
class Person{
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("有参构造方法");
}
public Person(){
System.out.println("无参构造方法实现");
}
}
public class Test{
public static void main(String[] args) throws NoSuchMethodException {
Class<?> cls = Person.class;
//取得指定的构造方法
Constructor<?> constructor = cls.getConstructor(String.class, int.class);
System.out.println(constructor);
//取得类中所有构造方法
// Constructor<?>[] constructors = cls.getConstructors();
// for (Constructor<?> constructor : constructors){
// System.out.println(constructor);
// }
}
}
4、通过Constructor类实例化对象
//实例化无参构造
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
Class<?> cls = Person.class;
//通过反射实例化对象时,只能实例化类的无参构造
System.out.println(cls.newInstance());
}
//实例化有参构造
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class<?> cls = Person.class;
Constructor<?> constructor = cls.getConstructor(String.class, int.class);
//通过newInstance实现有参构造
System.out.println(constructor.newInstance("张三",23));
}
5、反射调用普通方法
//取得一个类的全部普通方法
class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void eat(String name){
System.out.println(name +"吃午饭");
}
public void school(String name, int age){
System.out.println("姓名:"+name+age+"岁了");
}
}
public class Test{
public static void main(String[] args) {
Class<?> cls = Person.class;
Method[] methods = cls.getMethods();
for (Method method : methods){
System.out.println(method);
}
}
}
6、反射调用Getter、Setter方法
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("reflect.Person");
// 调用类中的普通方法都必须有实例化对象
Object obj = cls.newInstance();
// 取得setName这个方法的实例化对象,设置方法名称与参数类型
Method setMethod = cls.getMethod("setName", String.class);
// 通过Method类对象调用指定的方法,调用方法需要有实例化对象
// 同时传参
setMethod.invoke(obj, "zhangsan");
// 相当于Person对象.setName("yuisama");
Method getMethod = cls.getMethod("getName");
Object result = getMethod.invoke(obj);
// 相当于Person对象.getName() ;
System.out.println(result) ;
}
7、通过反射操作属性
//反射操作属性
public class Test {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("reflect.Person") ;
// 实例化本类对象
Object obj = cls.newInstance() ;
// 操作name属性
Field nameField = cls.getDeclaredField("name") ;
nameField.set(obj, "yuisama") ; // 相当于对象.name = "yuisama"
System.out.println(nameField.get(obj)); // 取得属性
}
}