反射小总结

获取class对象

最常用的方法

Class class = Class.forName("包.需要的类");
public class Demo01 {
    public static void main(String[] args) {
        //第一种获取Class的方法
//        Student stu = new Student();
//        Class stucls = stu.getClass();
//        System.out.println(stucls.getName());

        //第二种获取Class的方法
//        Class cls = Student.class;
//        System.out.println(cls.getName());
        //第三种获取Class的方法  较为常用
        try {
            Class cls = Class.forName("demo.Student");
            System.out.println(cls.getName());
        }catch(Exception e){
            System.out.println(e);
        }

    }
}

先创建需要的类

package demo;

public class Student {
    public int age;
    protected String name;
    private int id;
    public Student(){
        System.out.println("构造方法执行了");
    }
    protected Student(int age){
        this.age = age;
        System.out.println("带age的构造方法执行了");
    }
    private Student(String name){
        this.name = name;
        System.out.println("带name的构造方法执行了");
    }
     Student(int age,String name,int id){
        this.age = age;
        this.name = name;
        this.id = id;
    }

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

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

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

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }

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

public class Boy {
    public void show1(String s){

        System.out.println("调用了:公有的,String参数的show1(): s = " + s);
    }
    protected void show2(){

        System.out.println("调用了:受保护的,无参的show2()");
    }
    void show3(){

        System.out.println("调用了:默认的,无参的show3()");
    }
    private String show4(int age){
        System.out.println("调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);
        return "abcd";
    }

    public static void main(String[] args) {

        System.out.println("main方法执行了。。。");
    }
}

反射获取构造方法

代码基本一看就懂

/**
 *
 *
 * 通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
 *
 * 1.获取构造方法:
 * 		1).批量的方法:
 * 			public Constructor[] getConstructors():所有"公有的"构造方法
 public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
 * 		2).获取单个的方法,并调用:
 * 			public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
 * 			public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
 *
 * 			调用构造方法:
 * 			Constructor-->newInstance(Object... initargs)
 */

public class Demo02 {
    public static void main(String[] args) throws Exception{
      Class cls = Class.forName("demo.Student");
      //获取构造方法,批量获取,只能获取共有
        Constructor[] cons1 = cls.getConstructors();

        for (Constructor c1:cons1
             ) {
            System.out.println("名称:"+c1.getName());
            System.out.println("参数长度:"+c1.getParameters().length);
        }
        System.out.println("===============*********============");
        //获取全部的构造方法,包括私有的
        Constructor[] cons2 = cls.getDeclaredConstructors();
        for (Constructor c2:cons2
             ) {
            System.out.println("名称:"+c2.getName());
            System.out.println("参数长度:"+c2.getParameters().length);
        }

        System.out.println("*****************==========****************");
        //获取无参构造
        Constructor cons3 = cls.getDeclaredConstructor(null);
        System.out.println(cons3.getParameters().length);
        System.out.println("*****************==========****************");
        //获取有参构造
        Constructor cons4 = cls.getDeclaredConstructor(int.class,String.class,int.class);
        System.out.println(cons4.getParameters().length);
        Constructor cons5 = cls.getDeclaredConstructor(int.class);
        System.out.println(cons5.getParameters().length);
        System.out.println("*****************==========****************");
        //使用构造  创建对象
        Object obj1 = cons3.newInstance(null);
        System.out.println(obj1);
        System.out.println();
        Object obj2 = cons4.newInstance(20,"zhangsan",29);
        System.out.println(obj2);
        System.out.println();
        Object obj3 = cons5.newInstance(10);
        System.out.println(obj3);
    }
}

反射获取属性

/**
 *
 * 反射获取属性
 * 1.批量的
 *  		1).Field[] getFields():获取所有的"公有字段"
 * 		    2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
 *  2.获取单个的:
 *   		1).public Field getField(String fieldName):获取某个"公有的"字段;
 *   		2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
 *
 *   	 设置字段的值:
 *  		Field --> public void set(Object obj,Object value):
 *   					参数说明:
 *   					1.obj:要设置的字段所在的对象;
 *   					2.value:要为字段设置的值;
 */
public class Demo03 {
    public static void main(String[] args) throws Exception{
        //获取class对象
        Class cls = Class.forName("demo.Student");
        //获取公有属性
        Field[] fields = cls.getFields();
        for (Field f1:fields
             ) {
            System.out.println(f1.getName());
            System.out.println(f1.getType());
        }
        System.out.println("****************===========******************");
        //获取全部属性
        Field[] fields1 = cls.getDeclaredFields();
        for (Field f2:fields1
             ) {
            System.out.println(f2.getName());
            System.out.println(f2.getType());
        }
        System.out.println("****************===========******************");
        //获取单个属性
        Field field1 = cls.getDeclaredField("age");
        System.out.println(field1.getType());
        System.out.println();
        Field field2 = cls.getDeclaredField("name");
        System.out.println(field2.getType());
        System.out.println();
        Field field3 = cls.getDeclaredField("id");
        System.out.println(field3.getType());
        System.out.println("****************===========******************");
        //给属性赋值
        Object obj1 = cls.getDeclaredConstructor().newInstance();
        field1.set(obj1,55);
        field2.set(obj1,"张三");
       // field3.set(obj1,1001);私有化属性无法赋值
        System.out.println(obj1);
        System.out.println("****************===========******************");
        System.out.println();
        Field[] fis = cls.getDeclaredFields();
        Object obj2 = cls.getDeclaredConstructor().newInstance();
        for (Field ff:fis
             ) {
            switch (ff.getName()){
                case "age":
                    System.out.println(ff.getType());
                    ff.set(obj2,89);
                    System.out.println(obj2);
                    break;
                case "name":
                    System.out.println(ff.getType());
                    ff.set(obj2,"张三");
                    System.out.println(obj2);
                    break;
            }
        }
        System.out.println(obj2);
    }
}

反射获取方法

/**
 *
 * 反射获取方法
 * 1.批量的:
 * 		public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
 * 		public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
 * 2.获取单个的:
 * 		public Method getMethod(String name,Class<?>... parameterTypes):
 * 					参数:
 * 						name : 方法名;
 * 						Class ... : 形参的Class类型对象
 * 		public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
 *
 * 	 调用方法:
 * 		Method --> public Object invoke(Object obj,Object... args):
 * 					参数说明:
 * 					obj : 要调用方法的对象;
 * 					args:调用方式时所传递的实参;
 */
public class Demo04 {
    public static void main(String[] args) throws Exception{
       //创建class对象
        Class cls = Class.forName("demo.Boy");
        //获取公有的方法
        Method[] m1 = cls.getMethods();
        for (Method m:m1
             ) {
            System.out.println(m.getName());
        }
        System.out.println("***************=========//************");
        System.out.println();
        //获取全部的方法
        Method[] m2 = cls.getDeclaredMethods();
        for (Method m:m2
             ) {
            System.out.println(m.getName());
        }
        System.out.println("***************=========//************");
        System.out.println();
        //获取单独的方法
        Method m3 = cls.getDeclaredMethod("show1",String.class);
        System.out.println(m3.getName());
        Method m4 = cls.getDeclaredMethod("show2");
        System.out.println(m4.getName());
        Method m5 = cls.getDeclaredMethod("show3");
        System.out.println(m5.getName());
        Method m6 = cls.getDeclaredMethod("show4",int.class);
        System.out.println(m6.getName());
        Method m7 = cls.getDeclaredMethod("main",String[].class);
        System.out.println(m7.getName());
        System.out.println("***************=========//************");
        System.out.println();
        // 5.执行 明确执行的对象 方法的参数
        Object obj = cls.getDeclaredConstructor().newInstance();
        m3.invoke(obj,"琪琪小憨憨");
        System.out.println(obj);
        m4.invoke(obj,null);
        m5.invoke(obj,null);
        //m6.invoke(obj,200);私有方法无法进行赋值
        m7.invoke("main",(Object)new String[]{"a","b","c"});
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值