java反射机制,根据百科上的解释为:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。也就是说你可以通过反射来直接调用一个类的静态的方法或属性。
下面来说一下反射的基本步骤
1、获取要反射的类的Class实例
2、获取构造器
3、获取所有方法
4、获取所有属性
5、获取指定方法并调用
6、获取指定属性并赋值
1、获取要反射的类的Class实例(下面的步骤都会用到这个clazz对象),这次我反射的是java.lang.String类
public Class<?> clazz;
@Before
public void before() throws ClassNotFoundException {
// 两种方式获取Class实例 这个地方要填写完整的包名
// clazz = Class.forName("java.lang.String");
clazz = String.class;
}
2、获取构造器
private void constructor() throws NoSuchMethodException {
System.out.println("获取构造器----------华丽的分割线---------------------------------");
Constructor<?>[] constructor = clazz.getConstructors();
for (Constructor<?> aConstructor : constructor) {
// 获取方法的访问修饰符 private public protected
String s = Modifier.toString(aConstructor.getModifiers());
System.out.print(s + " " + " " + aConstructor.getName() + "(");
// 获取参数列表
Parameter[] parameters = aConstructor.getParameters();
for (int j = 0; j < parameters.length; j++) {
System.out.print(parameters[j].getType().getSimpleName() + " " + parameters[j].getName());
if (j != parameters.length - 1) {
System.out.print(",");
}
}
System.out.println(")");
}
}
3、获取所有方法
private void method(){
System.out.println("获取方法----------华丽的分割线---------------------------------");
// 获取所有方法,入如果只想获取公有方法可以用getMethods
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
// 获取访问修饰符
String modifier = Modifier.toString(method.getModifiers());
// 获取返回类型
String simpleName = method.getReturnType().getSimpleName();
// 获取方法名
String name = method.getName();
System.out.print(modifier + " " + simpleName + " " + name + "(");
// 获取参数列表
Parameter[] parameters = method.getParameters();
for (int j = 0; j < parameters.length; j++) {
System.out.print(parameters[j].getType().getSimpleName() + " " + parameters[j].getName());
if (j != parameters.length - 1) {
System.out.print(",");
}
}
System.out.println(")");
}
}
4、获取所有属性
private void field() throws IllegalAccessException {
System.out.println("获取属性----------华丽的分割线---------------------------------");
// 获取所有属性 对于公有属性可以用getFields来获取
Field[] declaredFields = clazz.getDeclaredFields();
for (Field e :
declaredFields) {
// 给属性赋值,第一个参数为指定的对象,后面一个参数为要赋予的值
// e.set("","");
System.out.println(Modifier.toString(e.getModifiers())+" "+e.getType().getSimpleName()+" "+e.getName());
}
}
5、获取指定方法并调用
private void methodWithParm() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
System.out.println("获取指定方法----------华丽的分割线---------------------------------");
// 获取指定方法,要指定方法名和参数类型
Method charAt = clazz.getMethod("charAt", int.class);
// 对于私有方法的调用,必须要设置这一项,否则会报错
// charAt.setAccessible(true);
String s = "abcd";
// 执行该方法,第一个参数为要执行的对象,后面的多个参数都为要执行的方法所需要参数
char c = (char) charAt.invoke(s,1);
System.out.println(c);
}
6、获取指定属性并赋值
private void appointedField() throws NoSuchFieldException, IllegalAccessException {
Field declaredField = clazz.getDeclaredField("hash");
// 对于私有属性必须要设置这一项
declaredField.setAccessible(true);
String x = "abcd";
System.out.println(x.hashCode());
// 给该属性赋值,第一个参数为要执行的对象,第二个参数为赋予的值
declaredField.set(x,123456);
System.out.println(x.hashCode());
}