java反射机制 (1) 内含详细说明注释

如果你看到这篇总结,想了解反射。我的建议是,你先把代码复制到idea或者Myeclipse中,然后逐个测试运行一下,结合注释,将会对反射有个了解。

1.百科关于反射的定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

2.首先建立两个类Customer.java和TestReflect.java
(https://img-blog.csdn.net/20180909184034984?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25iYV9saW5zaHVoYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

3.Customer.java代码如下

package com.company;
public class Customer {
    private  int id;
    private String  name;

    //无参构造方法  每个类默认都会有
    public Customer(){}
    //有参构造方法
    public Customer(String name,int id){
        this.id=id;
        this.name=name;
    }
    //属性id、name的set、get方法
    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;
    }  }

4.TestReflect.java代码如下

package com.company;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestReflect {
    //main主程序入口
    public static void main(String[] args){
        TestReflect.getProperty();
    }
//静态方法,可以用类名.静态方法直接调用
    public static void  getProperty(){
        try {
            //获取对象类型    包名.类名   ?代表任意类型对象
            Class<?> classType=Class.forName("com.company.Customer");

            //通过反射获取Customer类里面所有的属性 id、name,因为有多个属性,所以用数组接收值
            Field[] fields=classType.getDeclaredFields();
            for (int i=0;i<fields.length;i++){
                Field field=fields[i]; //取出每一个属性
                String fieldName=field.getName(); //取出每个属性的名字
               // System.out.println(fieldName); //代码到这,打印结果为:id,name


                //通过拼接获取方法名字如getId 、getName  setId 、setName
                          // 1.将属性的第一个字母截取出来并且大写
                         //例如Id  从下标0到下标1取出字母为i
                String firstLetter= fieldName.substring(0, 1).toUpperCase();
                       //2.拼接属性对应的get和set方法名字  下标从1开始,不设定截止下标
                String getMethodName="get"+firstLetter+fieldName.substring(1);
                String setMethodName="set"+firstLetter+fieldName.substring(1);
               // System.out.println(getMethodName);  打印输出getId  getName
               // System.out.println(setMethodName);  setId setName


                /*获取get方法、set方法
                    getMethod()第一个参数是方法名字如getId ,第二个参数是传过来参数的类型,
                  如Customer类中的getId()内没有参数类型,所以第二个参数为new Class[]{}
                 如setId(int id),第二个参数为new Class[]{int.calss}       */
                Method getMethod=classType.getMethod(getMethodName,new Class[]{});
                //因为setId(int id)  setString(String name) 有String和int,所以用field.getType()获取参数类型
                Method setMethod=classType.getMethod(setMethodName,new Class[]{field.getType()});
                //System.out.println(getMethod);
                //System.out.println(setMethod);
                /*   输出结果为
                public int com.company.Customer.getId()
                public void com.company.Customer.setId(int)
                public java.lang.String com.company.Customer.getName()
               public void com.company.Customer.setName(java.lang.String)
                 */


                /*创建对象
               Customer customer=new Customer(); 常规通过new创建对象
                通过反射创建对象    通过有参构造方法创建对象 */
               Object obj= classType.getConstructor(String.class,int.class).newInstance("张三",20);
//             Object obj= classType.getConstructor(new Class[]{String.class,int.class}).newInstance(new Object[]{"张三",20});


               /*执行方法
                //执行get方法获取对象的属性值,第一个参数为对象obj,第二个参数为get方法内的参数
                  get方法没有参数,所以括号内为new Object[]{}  ,get方法有参数的话()内 为new Object[]{11,12}
                  get方法有参数的话,invoke()内可简写为invoke(obj,11,12)               */
                Object value=getMethod.invoke(obj,new Object[]{});
//                System.out.println("执行了方法"+getMethodName+",得到的值为"+value);

                //执行了set方法动态赋值
                Object obj2=setMethod.invoke(obj,new Object[]{value});
//                Object obj2=setMethod.invoke(obj,value); 简化版
                System.out.println("执行了方法"+getMethodName+",得到的值为"+value);

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

    }

}

该链接是java反射运用的小实例
(https://blog.csdn.net/nba_linshuhao/article/details/82561165)

猜你喜欢

转载自blog.csdn.net/nba_linshuhao/article/details/82555689