java 反射入门使用

java反射可以不像一般情况下的new,只需要反射对象就可以。

本人使用的是Spring boot上用的,在java上一样使用不需要其他架包。

首先需要一个bean叫student类:

public class Student {
    private int id;
    private String name;
    private String age;

    public Student(int id, String name, String age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Student() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

然后是反射的简单使用方法:

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

@Component
public class MyFanShe {
    Logger logger=Logger.getLogger(getClass());

    Class aClass;

    String className;

    public String getName(){

        try {
//                                    这里的类是复制的全路径
            aClass = Class.forName("com.example.druid.fan_she.Student");
            className = aClass.getName();
            logger.info(className);
//            获取student类下的所有的方法
            Method[] methods = aClass.getDeclaredMethods();
            for (Method m:methods){
                logger.info(""+m);
            }

            logger.info("下面是获取student类下的属性(字段)");

            Field[] declaredFields = aClass.getDeclaredFields();
            for (Field f:declaredFields){
                logger.info(""+f);
            }
            logger.info("student类下的所有构造方法");
            Constructor[] declaredConstructors = aClass.getDeclaredConstructors();
            for (Constructor c:declaredConstructors){
                logger.info(c);
            }
//获取构造方法、方法使用如下:
            try {
                Constructor setId = aClass.getConstructor(int.class,String.class,String.class);
                Object o = aClass.getDeclaredConstructor().newInstance();

                Method toString = aClass.getMethod("toString", null);

                Student student= (Student) setId.newInstance(1,"休息休息吧","20");
                logger.info(student.getAge()+" "+student.getName()+" "+student.getId() );

                Method getId = aClass.getMethod("getId", null);
                Object invoke = getId.invoke(student, null);
                logger.info("invoke="+invoke);

                logger.info(setId);
            } catch (Exception e) {
                e.printStackTrace();
            }

//            第二个

//            需要反射的类
            Class myclass=Class.forName("com.example.druid.fan_she.Student");
//            获取类的构造方法
            Constructor constructor = myclass.getConstructor(int.class, String.class, String.class);
//            student得到反射的类,是通过构造方法实现的
            Student student= (Student) constructor.newInstance(7,"asdf","44");
//            获取它的方法
            Method setId = myclass.getMethod("setId", int.class);
//            将值代理到类中,会替换构造方法的7
            setId.invoke(student,5);
//从反射中获取方法,没有需要注入的参数的就可以不写参数只写方法名字
            Method getId = myclass.getMethod("getId");
//            通过方法开始获取值然后打印,在没有参数的情况下不用写除类以外的参数
            logger.info(getId.invoke(student));


        } catch (Exception e) {
            e.printStackTrace();
        }
        return className;
    }

}

获取属性详细方法:

 Field getField(String name) 
     返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 
  Field[] getFields() 
     返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。 
  Field getDeclaredField(String name) 
     返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 
  Field[] getDeclaredFields() 
     返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

获取构造方法:

  Constructor<T> getConstructor(Class<?>... parameterTypes) 
     返回一个 Constructor 对象,它反映此 Class对象所表示的类的指定公共构造方法。
  Constructor<?>[] getConstructors() 
     返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

以前的一个方法过时了,采用了新的方式,旧的方式是:

aClass.newInstance();
新的:
aClass.getDeclaredConstructor().newInstance();
上面程序结果为(本人使用的是Spring boot上用的,在java上一样不需要其他架包):
2018-06-05 17:23:20,704 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] com.example.druid.fan_she.Student
2018-06-05 17:23:20,748 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public java.lang.String com.example.druid.fan_she.Student.toString()
2018-06-05 17:23:20,748 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public java.lang.String com.example.druid.fan_she.Student.getName()
2018-06-05 17:23:20,748 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public void com.example.druid.fan_she.Student.setName(java.lang.String)
2018-06-05 17:23:20,748 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public int com.example.druid.fan_she.Student.getId()
2018-06-05 17:23:20,748 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public void com.example.druid.fan_she.Student.setId(int)
2018-06-05 17:23:20,749 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public java.lang.String com.example.druid.fan_she.Student.getAge()
2018-06-05 17:23:20,749 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public void com.example.druid.fan_she.Student.setAge(java.lang.String)
2018-06-05 17:23:20,749 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] 下面是属性(字段)
2018-06-05 17:23:20,749 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] private int com.example.druid.fan_she.Student.id
2018-06-05 17:23:20,749 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] private java.lang.String com.example.druid.fan_she.Student.name
2018-06-05 17:23:20,750 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] private java.lang.String com.example.druid.fan_she.Student.age
2018-06-05 17:23:20,750 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] 所有的构造方法
2018-06-05 17:23:20,750 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public com.example.druid.fan_she.Student(int,java.lang.String,java.lang.String)
2018-06-05 17:23:20,750 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public com.example.druid.fan_she.Student()
2018-06-05 17:23:20,751 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] 20 休息休息吧 1
2018-06-05 17:23:20,751 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] invoke=1
2018-06-05 17:23:20,751 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public com.example.druid.fan_she.Student(int,java.lang.String,java.lang.String)
2018-06-05 17:23:20,752 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] 5


猜你喜欢

转载自blog.csdn.net/qq_33868430/article/details/80585904