java反射

package com.itbin.smeb.model;

public class Testreflex {
    private String id;
    protected String name;
    public String note;

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }
    //public 构造器
    public Testreflex() {
    }
    //私有的 构造器
    private Testreflex(String id) {
        this.id = id;
    }
    //protected 构造器
    protected Testreflex(String id, String name) {
        this.id = id;
        this.name = name;
    }
    //public 构造器
    public Testreflex(String id, String name, String note) {
        this.id = id;
        this.name = name;
        this.note = note;
    }

    @Override
    public String toString() {
        return "Testreflex{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", note='" + note + '\'' +
                '}';
    }
}
package com.itbin.smeb;

import com.itbin.smeb.model.Testreflex;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.lang.reflect.Constructor;
import java.util.Arrays;

@SpringBootTest
class SmebApplicationTests {
    @Test
    public void reflexTest() throws Exception {
        //获取类的三种方式
        //第一种: Class.forName()  常用
        Class testreflex = Class.forName("com.itbin.smeb.model.Testreflex");
        //第二种: 都有对象了 反射显得多余
        Class<? extends Testreflex> aClass = new Testreflex().getClass();
        //第三种 : 需要导包 依赖性太强
        Class<Testreflex> testreflexClass = Testreflex.class;

        System.out.println(testreflex == aClass);  //true
        System.out.println(testreflex == testreflexClass); //true
        //反射用构造器创建对象
        Constructor constructor = testreflex.getConstructor(String.class,String.class,String.class);
        Testreflex id1 = (Testreflex) constructor.newInstance("id1","name1","note1");
        System.out.println(id1.toString());

        System.out.println("**********************所有公有构造方法*********************************");
        Constructor[] constructors = testreflex.getConstructors();
        Arrays.stream(constructors).forEach(System.out::println);

        System.out.println("************所有的构造方法(包括:私有、受保护、默认、公有)***************");
        Constructor[] declaredConstructors = testreflex.getDeclaredConstructors();
        Arrays.stream(declaredConstructors).forEach(System.out::println);

        System.out.println("*****************获取公有、无参的构造方法*******************************");
        Constructor declaredConstructor = testreflex.getDeclaredConstructor(null);
        //1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型
        //2>、返回的是描述这个无参构造函数的类对象。
        Object o = declaredConstructor.newInstance();
        System.out.println((Testreflex)o);

        System.out.println("******************获取私有构造方法,并调用*******************************");
        Constructor declaredConstructor1 = testreflex.getDeclaredConstructor(String.class);
        System.out.println(declaredConstructor1);
        //调用构造方法
        declaredConstructor1.setAccessible(true);//暴力访问(忽略掉访问修饰符)
        Object o1  = declaredConstructor1.newInstance("100");
        System.out.println(o1.toString());


         System.out.println("******************获取方法*******************************");
        //如果使用getDeclaredMethod,就不能获取父类方法,如果使用getMethod,就不能获取私有方法



        /**
         * true
         * true
         * Testreflex{id='id1', name='name1', note='note1'}
         * **********************所有公有构造方法*********************************
         * public com.itbin.smeb.model.Testreflex()
         * public com.itbin.smeb.model.Testreflex(java.lang.String,java.lang.String,java.lang.String)
         * ************所有的构造方法(包括:私有、受保护、默认、公有)***************
         * private com.itbin.smeb.model.Testreflex(java.lang.String)
         * public com.itbin.smeb.model.Testreflex()
         * protected com.itbin.smeb.model.Testreflex(java.lang.String,java.lang.String)
         * public com.itbin.smeb.model.Testreflex(java.lang.String,java.lang.String,java.lang.String)
         * *****************获取公有、无参的构造方法*******************************
         * Testreflex{id='null', name='null', note='null'}
         * ******************获取私有构造方法,并调用*******************************
         * private com.itbin.smeb.model.Testreflex(java.lang.String)
         * Testreflex{id='100', name='null', note='null'}
         */
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值