1.获取class对象

​ eclipse按alt+/不会补全新建对象的变量名,需要手动补全;

  1. 类的class属性[推荐]

    代码更安全性能更好

    1
    class clazz = String.class;
  2. Class的静态方法forName

    仅当给出完整类名(包含包名)时使用,因为如果类包名错误会报错;

    1
    2
    3
    4
    5
    try{
    Class forName = Class.forName("java.lang.String");
    }catch(ClassNotFoundException e){
    ...
    }
  3. Object类里的getClass()方法

    1
    2
    String str= "x";
    Class clazz = str.getClass();

2.新建对象

  1. java不推荐使用

    1
    2
    3
    4
    5
    try{
    Object object = clazz.newInstance(["参数1","参数2",..]);
    }catch(){
    ...
    }
  2. java推荐使用[推荐]

    1
    2
    3
    4
    5
    try{
    Object object = clazz.getDeclaredConstructor().newInstance(["参数1","参数2",...]);
    }catch(){
    ...
    }

3.获取class信息[了解]

  1. 获取修饰符[了解]

    1. 返回值是修饰符值相加

      1
      int x = clazz.getModifiedrs();
    2. 列表

      修饰符
      ABSTRACT 1024
      FINAL 16
      INTERFACE 512
      NATIVE 256
      PRIVATE 2
      PROTECTED 4
      PUBLIC 1
      STATIC 8
      STRICT 2048
      SYNCHRONIZED 32
      TRANSIENT 128
      VOLATILE 64
  2. 获取类名

    1. 获取完整包类名

      1
      String name = clazz.getName();
    2. 获取类名

      1
      String name = clazz.getSimpleName();
  3. 获取包名

    1
    Stirng name = clazz.getPackName();
  4. 获取超类(父类)

    1
    Class sclazz = clazz.getSuper().getName();

4.获取class属性

​ getDeclarredFields/Methods/Constructors是获取私有数据,不加不能获取私有数据

  1. 获取属性(变量)数组

    1
    Field[] x= clazz.getFields();
    • 已知属性名获取[不常用]

      1
      Field x =clazz.getFields("属性名");
  2. 获取方法数组

    1
    Method[] y = clazz.getDeclaredMethods();
    • 已知方法名和类型获取[不常用]

      1
      Method y = clazz.getDeclaredMethods("方法名",参数类型1.class,参数类型2.class);
  3. 获取构造方法数组

    1
    Constructors[] z = clazz.getDeclaredConstructors()[.getName];
    • 已知有参构造器获取[不常用]

      1
      Constructors z = clazz.getDeclaredMethods(参数类型1.class,参数类型2.class);

5.获取修改属性信息

  1. 获取名称

    1
    String name = x/y/z.getName();
  2. 获取修饰符

    1
    int a = x/y/z.getModifiders();
  3. 设置私有属性可被修改/访问

    1
    x/y/z.setAccessible(true);
  4. 获取属性类型

    1
    Class type= x.getType()[.getName()];
  5. 属性名

    1. 获取

      1
      Object oject = [(类型)]x.get(要获取的对象);
    2. 赋值

      1
      x.set(要被赋值的对象,"值");
  6. 获取参数列表类型

    1
    Class[] Parameter = y/z.getParameterTypes();
  7. 获取返回值类型

    1
    Class return = y/z.getReturnType();
  8. 获取抛出异常的类型

    1
    Class exception = y/z.getExceptionType();
  9. 执行方法

    1
    x.invoke(要被执行的方法,"参数1","参数2");

6.事例

​ 模仿springIOC功能

  1. Father.java

    1
    2
    3
    4
    private String name;
    private Integer age;
    private String sex;
    get/set/构造方法/toString;
  2. MySpring.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public Object getBean(String className) {
    Object object = null;
    Scanner input = new Scanner(System.in);
    System.out.println("请给"+className+"类的对象赋值");
    try {
    //1.getBean
    Class<?> clazz = Class.forName(className);
    object = clazz.newInstance();
    //2.依赖注入:通过成员变量生成set方法
    Field[] fields = clazz.getDeclaredFields();
    for(Field field :fields) {
    //(1.)拼接成员变量变成set方法
    String fieldName = field.getName();
    String upperCase = fieldName.substring(0, 1).toUpperCase();
    String substring = fieldName.substring(1);
    StringBuilder setMethodName = new StringBuilder("set");
    setMethodName.append(upperCase);
    setMethodName.append(substring);
    //(2.)通过拼接到的set方法名获取set方法对象
    Class<?> Fieldtype = field.getType();
    Method method = clazz.getDeclaredMethod(setMethodName.toString(), Fieldtype);
    method.setAccessible(true);
    System.out.println("请给"+setMethodName+"赋值");
    String value = input.nextLine();
    //(3.)采用newInteger(String)的方式转换格式
    Constructor<?> fieldConstructor = Fieldtype.getDeclaredConstructor(String.class);//获取参数类的(string)构造方法
    Object value2 = fieldConstructor.newInstance(value);//通过构造方法新建对象
    method.invoke(object, value2);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return object;
    }
  3. test.java

    1
    2
    3
    4
    5
    public static void main(String[] args) {
    MySpring spring = new MySpring();
    Father father = (Father)spring.getBean("Other.反射.untity.Father");
    System.out.println(father);
    }

2.commons

最后更新: 2019年11月06日 11:36

原始链接: https://airbash.cn/2019/11/01/JAVA/%E5%8F%8D%E5%B0%84/

× 请我吃糖~
打赏二维码