最近看Spring源码,突然发现有好多地方都用到了反射,特此来回顾一下:
先来创建userInfo基础类
public class UserInfo {
private String userName;
private Integer age;
public String school;
public UserInfo() {
}
private UserInfo(String name, Integer age, String shool) {
this.userName = name;
this.age = age;
this.school = shool;
}
public UserInfo(String name, Integer age) {
this.userName = name;
this.age = age;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
private String getUserName() {
return userName + "get方法";
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "UserInfo{" +
"userName='" + userName + '\'' +
", age=" + age +
", school='" + school + '\'' +
'}';
}
}
public class Demo{
public static void main(String[] args) throws Exception {
Class mClass=Class.forName("com.croshe.qlqw.UserInfo");
System.out.println("输出类名——————————————————");
System.out.println(mClass.getName());
System.out.println(mClass.getSimpleName());//不带路径的类名
//获取属性
System.out.println("输出所有属性——————————");
// Field[] fields= mClass.getDeclaredFields();//获取所有私有、公有的属性
Field[] fields = mClass.getFields();//获取所有公有的属性
for (Field field:
fields) {
String fieldName= field.getName();//属性名
int fieldFangWen= field.getModifiers();//修饰符
Class fieldType=field.getType();//属性的类型
System.out.println(Modifier.toString(fieldFangWen)+" "+fieldType.getSimpleName()+" "+fieldName);
}
//获取方法
System.out.println("获取所有方法——————————");
Method[] methods = mClass.getDeclaredMethods();//获取所有私有、公有的方法
for (Method method:
methods) {
String methodName= method.getName();//方法名
int methodFangWen =method.getModifiers();//修饰符
Class aClass= method.getReturnType();//返回值类型
System.out.print(Modifier.toString(methodFangWen)+" "+aClass.getSimpleName()+" "+methodName+"(");
Class[] classes =method.getParameterTypes();//方法的传入参数
for (int i = 0; i < classes.length; i++) {
String SimpleMethodName=classes[i].getSimpleName();
if(i!=classes.length-1){
System.out.print(SimpleMethodName+" arg"+i+",");
}else
System.out.print(SimpleMethodName+" arg"+i);
}
System.out.println(");");
}
//获取构造器
System.out.println("输出所有构造器————————————————————");
Constructor[] constructors= mClass.getDeclaredConstructors();//获取所有构造器(私有、公有)
for (Constructor constructor:
constructors) {
String constructorName = constructor.getName();//方法名
int methodFangWen = constructor.getModifiers();//修饰符
Class[] constructorParameter = constructor.getParameterTypes();//方法的参数列表
System.out.print(Modifier.toString(methodFangWen)+" "+constructorName.substring(constructorName.lastIndexOf(".")+1, constructorName.length())+"(");
for(int h=0;h<constructorParameter.length;h++)
{
String parameterName = constructorParameter[h].getSimpleName();
if(h!=constructorParameter.length-1)
System.out.print(parameterName+" arg"+h+",");
else
System.out.print(parameterName+" arg"+h);
}
System.out.println(");");
}
//如何执行指定的方法
System.out.println("------------反射执行方法--------------------");
String name ="getMyInfo";//需要调用的方法名
Class[] parameterTypes = new Class[3];//调用方法需要的参数
parameterTypes[0]= String.class;
parameterTypes[1]= Integer.class;
parameterTypes[2]= String.class;
// Method me = mClass.getDeclaredMethod(name, parameterTypes);
// Object obj = mClass.newInstance();//创建实例
Object[] arg = new Object[3];
arg[0]="李四";
arg[1]=new Integer(18);
arg[2]="王五";
// me.invoke(obj, arg);//调用
String constuctorName = mClass.getSimpleName();
//获取到此参数匹配的构造器
Constructor declaredConstructor = mClass.getDeclaredConstructor(parameterTypes);
//此时方法是私有的话可以使用以下方法:setAccessible
declaredConstructor.setAccessible(true);
//新建一个实例
Object object=declaredConstructor.newInstance(arg);
System.out.println(object.toString());
//给set方法设置值
Method method=mClass.getDeclaredMethod("setUserName",String.class);
// Object obj= mClass.newInstance();
// System.out.println(mClass.newInstance());
method.setAccessible(true);
method.invoke(object,"张三");
//Method method1=mClass.getDeclaredMethod("getUserName");
// method1.setAccessible(true);
// System.out.println(method1.invoke(object));
//此时get出来的值已改变
System.out.println(object);
}
}