JAVA的反射机制
作者:邱名涛
撰写时间:2019年5月2日
关键技术:Java+MyEclipse
在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,
对于任意 一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),
这种动态 获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。
通俗点讲, 通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。
1、先准备一个测试的类(获取私有属性)
package com.gx.reflectdemo;
public class Person {
private String name;
private int age;
private Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private void test() {
System.out.println("private void test");
}
public String say(String txt) {
return age + "岁的" + name + "说:\"" + txt + "\"";
}
}
2、创建反射机制(通过链接,获取类)
package com.gx.reflectdemo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
//加载类
Class<?> class1= ReflectDemo.class.getClassLoader().loadClass("com.gx.reflectdemo.Person");//(已知类)?=代表一切
Class<?> class2=Class.forName("com.gx.reflectdemo.Person");//(已知类)通过链接,获取类
Class<?> class3=Person.class;//(已知类)直接获取类名
Class<?> class4=new Person("",1).getClass();//要实例才可以拿到类信息(在已知对象的情况下才能去拿 )
//通过反射机制获取构造器
System.out.println("--------取构造器-------");
// class2.getConstructors();只能拿到,你能访问的构造器
//class2.getDeclaredConstructors();可以拿到全部的构造器
//constructor[]返回一个包含某些 Constructor 对 象的数组,这些对象反映此 Class 对象所表示的类的所有公 共构造方法
Constructor<?>[] constructors= class2.getDeclaredConstructors();//把所有构造器装进数组
for (Constructor<?> constructor : constructors) {//遍历数组内容
//修饰符、名称、形参列表类型
StringBuilder builder=new StringBuilder();
//修饰符
builder.append("\t"+Modifier.toString(constructor.getModifiers()));//append拼接
//名称
builder.append(" "+constructor.getName());
//形参列表类型
builder.append("(");
Class<?>[] rarameterTypes=constructor.getParameterTypes();
for (Class<?> rarameterType : rarameterTypes) {
builder.append(rarameterType.getSimpleName()+", ");
}
builder.append(")");
System.out.println(builder.toString());
}
//通过反射机制获取方法
//getMethods:你能够访问的//getDeclareMethods:获取全部
Method[] methods=class2.getDeclaredMethods();
for (Method method : methods) {
StringBuilder builder=new StringBuilder();
//修饰符
builder.append("/t"+Modifier.toString(method.getModifiers()));
}
}
}
–获取方法私有的String和int参数:
–输出通过反射机制获取的参数