java基础之反射

1.获取类对象 Class class = Class.forName("pojo.Hero");
2.获取构造器对象 Constructor con = clazz.getConstructor(形参.class);
3 获取(实例化)对象 Hero hero =con.newInstance(实参);

通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;

1.获取构造方法:


1).批量的方法:
public Constructor[] getConstructors():所有"公有的"构造方法
public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)      

  
2).获取单个的方法,并调用:
public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;    

2、获取对象属性
Field[] allFields = class1.getDeclaredFields();//获取class对象的所有属性
Field[] publicFields = class1.getFields();//获取class对象的public属性
Field ageField = class1.getDeclaredField("age");//获取class指定属性
Field desField = class1.getField("des");//获取class指定的public属性

3、获取对象方法
Method[] methods = class1.getDeclaredMethods();//获取class对象的所有声明方法
Method[] allMethods = class1.getMethods();//获取class对象的所有方法 包括父类的方法

Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。

例:

public static void main(String[] args) {
        try {
            /**
             * class.newInstance() 调用默认的、公有的、无参构造函数
             */
            Class dataClass = Class.forName("com.sys.server.model.common.DataVo");
            DataVo dataVo = (DataVo) dataClass.newInstance();
            System.out.println(dataVo);

            /**
             *
             * Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
             * Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。
             *
             *
             * dataClass.getConstructor() 调用默认的或公有的无参构造函数
             * dataClass.getConstructor(String.class...) 获取公有的有参构造函数
             *
             * dataClass.getDeclaredConstructor() 可调用默认的、公有的、私有的无参构造函数
             * dataClass.getDeclaredConstructor(String.class...) 调用默认的、公有的、私有的有参构造函数
             *
             */
            Constructor constructor = dataClass.getConstructor();
            Object dataVo1 = constructor.newInstance();
            System.out.println(dataVo1);

            constructor = dataClass.getConstructor(String.class);
            Object dataVo2 = constructor.newInstance("999");
            System.out.println(dataVo2);

            constructor = dataClass.getDeclaredConstructor();
            constructor.setAccessible(true);
            Object dataVo3 = constructor.newInstance();
            System.out.println(dataVo3);

            constructor = dataClass.getDeclaredConstructor(String.class);
            constructor.setAccessible(true);
            Object dataVo4 = constructor.newInstance("888");
            System.out.println(dataVo4);

            /**
             *  getField(String fieldName),获取某个"公有的"字段
             *  getDeclaredField(String fieldName),获取某个字段(可以是私有的)
             */
            Field field = dataClass.getDeclaredField("pileId");
            // 暴力反射,不设置为true,私有属性设置值会抛异常
            field.setAccessible(true);
            field.set(dataVo4, "111");
            System.out.println(dataVo4);


            /**
             * getMethod(String name,Class<?>... parameterTypes) 获取公有的setPileNo()方法
             * getDeclaredMethod(String name,Class<?>... parameterTypes) setStationId()方法
             */
            Method method = dataClass.getMethod("setPileNo", String.class);
            method.invoke(dataVo4, "2222");
            System.out.println(dataVo4);

            method = dataClass.getDeclaredMethod("setStationId", String.class);
            method.setAccessible(true);
            method.invoke(dataVo4, "3333");
            System.out.println(dataVo4);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 DataVo 

package com.sys.server.model.common;

import lombok.Data;

/**
 * DataVo
 *
 * @author admin
 * @date 2021-10-28 14:17
 */
@Data
public class DataVo {

    private String pileId;
    private String orgCode;
    private String stationId;
    private String pileNo;
    private String pileName;


    public DataVo(){

    }
    public DataVo(String name){
        this.pileName = name;
    }

    public String getPileId() {
        return pileId;
    }

    public void setPileId(String pileId) {
        this.pileId = pileId;
    }

    public String getOrgCode() {
        return orgCode;
    }

    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }

    public String getStationId() {
        return stationId;
    }

    private void setStationId(String stationId) {
        this.stationId = stationId;
    }

    public String getPileNo() {
        return pileNo;
    }

    public void setPileNo(String pileNo) {
        this.pileNo = pileNo;
    }

    public String getPileName() {
        return pileName;
    }

    public void setPileName(String pileName) {
        this.pileName = pileName;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值