反射的基本用法

最近看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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值