前言
反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,今天主要学习反射的几种用法。
一、基本反射技术
1.1 根据一个字符串得到一个类
getClass方法
String name = "张三";
Class c1 = name.getClass();
System.out.println(c1.getName());
打印结果如下:
java.lang.String
Class.forName
比如我们获取java.lang.String的类名
getSuperclass().getName()
获取到他的父类
try {
String name = "java.lang.String";
Class c1 = Class.forName(name);
// 获取到他的父类
System.out.println(c1.getSuperclass().getName());
System.out.println(c1.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
打印结果如下:
java.lang.Object
java.lang.String
Type属性
基本类型都有type属性,可以得到这个基本类型的类型,比如:
Class c1 = Boolean.TYPE;
Class c2 = Byte.TYPE;
Class c3 = Float.TYPE;
Class c4 = Double.TYPE;
二、获取类的操作
为了便于测试,我们定义一个Person类,Person类如下:(省略get和set方法)
public class Person {
private String name;
private int age;
public Person(int age) {
this.age = age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("My name is " + name + "I'm " + age);
}
private Person(String name) {
this.name = name;
System.out.println("My name is " + name);
}
public Person() {
}
}
1、获取类的所有构造方法
constructor.getModifiers() 返回的是一个int类型的值。
Modifier.toString(constructor.getModifiers()) 重写了toString方法,内部做&运算,返回修饰符类型。
constructor.getParameterTypes() 获取构造方法参数的类型。
Person person = new Person();
Class p = person.getClass();
Constructor[] declaredConstructors = p.getDeclaredConstructors();
for (Constructor constructor : declaredConstructors) {
System.out.println("修饰符:" + Modifier.toString(constructor.getModifiers()));
Class[] parameterTypes = constructor.getParameterTypes();
for (Class type : parameterTypes) {
System.out.println("参数 :" + type.getName());
}
System.out.println("");
}
打印结果如下:
2、 获取类中特定的构造方法
public
我们可以通过getDeclaredConstructor()方法传参获取特定参数类型的构造方法。
Class[] parameters = {String.class, int.class};
Person person = new Person();
Class p = person.getClass();
Constructor declaredConstructor = p.getDeclaredConstructor(parameters);
Person instance = (Person) declaredConstructor.newInstance("张三 ", 22);
打印结果如下:
My name is 张三 I’m 22
private私有构造方法
declaredConstructor.setAccessible(true); 设置无障碍为true
Class[] parameters = {String.class};
Class personClass = Class.forName("com.jvmtest.reflex.Person");
Constructor declaredConstructor = personClass.getDeclaredConstructor(parameters);
declaredConstructor.setAccessible(true);
Person instance = (Person) declaredConstructor.newInstance("李四");
打印结果如下:
My name is 李四
调用类的私有方法
和私有构造方法的调用类似
Class[] parameters = {String.class};
Class name = Class.forName("com.jvmtest.reflex.Person");
Method welcome = name.getDeclaredMethod("welcome", parameters);
welcome.setAccessible(true);
Person invoke = (Person) welcome.invoke(name.newInstance(),"王五");
打印结果如下:
王五