反射相关

import java.io.File;
import java.io.FileDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class a200528反射 {

    public static void main(String[] args) {

        try{
            Class<?> a = 儿子.class;


            Constructor constructor =a.getDeclaredConstructor(String.class,int.class);//单个方法

            constructor.setAccessible(true);

            儿子 s1 = (儿子) constructor.newInstance("张飞",18);

            //System.out.println(s1); //1

            Field file = a.getDeclaredField("age");//单个属性

            file.setAccessible(true);

            file.setInt(s1,90);

            //System.out.println(s1); //2

            //System.out.println(file); //3

            Field[] fields= a.getDeclaredFields();

            for (Field f:
                 fields) {
                System.out.println(f);
            }

            System.out.println("==================================");

            Field[] fields1= a.getFields();

            for (Field f:
                    fields1) {
                System.out.println(f);
            }


            Constructor[] constructors = a.getDeclaredConstructors();
            for(Constructor constructor1 : constructors){
                //System.out.println(constructor1);
            }

            Method[] methods = a.getDeclaredMethods();

            for(Method method : methods){
                //System.out.println(method);
            }


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

    }
}




class 爸爸{
    public double height = 80.80;
    private String 老婆;

    public void 跑步(){}
    private void 午饭吃的啥(){}
}


class 儿子 extends 爸爸{
   public String name;
   private int age = 18;
   private String 妈妈;


    private 儿子(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private void 上课(){}

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

通过反射可以获取到private的构造方法

加了Declared只能获取自己的所有field、constructor、method(包括private),不加就只能获得自己和父类的所有public的field、constructor、method

用例2:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class aaa {

    public static void main(String[] args) {
//        经理 p = new 经理("张三",10001,9000);
//        System.out.println(p);
       // 雇员 a1 = new 经理();
//        经理 b = (经理) a;

        try{
            Class<?> a = 经理.class;
            Constructor constructor = a.getDeclaredConstructor(String.class,int.class,int.class);
            constructor.setAccessible(true);
            经理 p = (经理) constructor.newInstance("李四",10001,70000);
            //System.out.println(p.salary);
            Field field = a.getField("salary");
            field.setAccessible(true);
            field.setInt(p,8000);
            //System.out.println(p.salary);
            System.out.println(p.toString());
            //============================================
            Class<?> b = a.getSuperclass();//获取到父类的class,以相同操作获得父类的相关属性方法
            Constructor constructor1 = b.getDeclaredConstructor();
            雇员 p1 = (雇员) constructor1.newInstance();
            System.out.println(p1.toString());

            //method用法    方法名   传入的参数类型new Class[]{},无参不写
            Method   method = b.getDeclaredMethod("吃东西",String.class);
            //访问属性设置为ture
            method.setAccessible(true);
            //调用方法的对象,传参new Object[]{},跟上边保持一致
            method.invoke(p1,"香蕉");

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

class 雇员{
    private String 开除时间;
    public int salary ;


    public 雇员(){
        this.开除时间="十年后";
        this.salary=10000;
    }


    private void 吃东西(String foodName){
        System.out.println("今天吃了 "+foodName);
    }


    public  void 使用厕所(){
        System.out.println("雇员使用厕所");
    }


    public 雇员(String 开除时间 ,int salary){
        this.salary=salary;
        this.开除时间=开除时间;
    }

    @Override
    public String toString() {
        return "雇员{" +
                "开除时间='" + 开除时间 + '\'' +
                ", salary=" + salary +
                '}';
    }

}

 class 经理 extends 雇员{
    private String name ;
    private int num;


    public 经理(String name,int num,int salary){
        this.name = name;
        this.num = num;
        this.salary=salary;
    }

    public void 发起会议(){
        System.out.println("经理"+name+"发起了会议");
    }

    @Override
    public String toString() {
        return "经理{" +
                "salary=" + salary +
                ", name='" + name + '\'' +
                ", num=" + num +
                '}';
    }

}

在这里插入图片描述
既可以获取,也可以调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值