编程语言
首页 > 编程语言> > java基础(十六):反射

java基础(十六):反射

作者:互联网

反射

运行程序:

类加载:

面向对象:

Class类

可变参数

注意

  1. 方法参数列表中只能定义一个可变参数

  2. 方法参数列表中可以同时定义单个参数和可变参数,但是可变参数必须放到参数列表的最后

public class ChangeDemo {
    public static void main(String[] args) {
        System.out.println(add(3,5));
        int[] arr = new int[]{3,1,5,7,6};
        System.out.println(add(arr));

    }

    public static int add(int ... arr){
        // 以数组的形式传入
        int sum = 0;
        for (int i : arr){
            sum += i;
        }
        return sum;
    }
}

优点:

  1. 简化了代码,提高了代码的复用性;

  2. 提高了代码的灵活性;

反射概念

Class类:

Constructor类:

Field类:

Method 类:

优点:

缺点:

示例:模拟数据库操作

public class DataBaseDemo {
    public static void main(String[] args) throws Exception {
        // 加载配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream(".\\dataBase.properties"));
        String value = properties.getProperty("DBName");
        System.out.println(value);
        // 使用类名(value)创建对象
        Class clz = Class.forName(value);
        System.out.println(clz);  // class cn.ysu.reflect.MySql
        // newInstance() 获取Class对象对应的类的实例 (过时)
        // 只能用于无参构造
        // Object o = clz.newInstance();

        // 通过有参构造创建对象
        Constructor constructor = clz.getConstructor(String.class);
        // 通过构造方法的 newInstance() 获取对象
        Object o = constructor.newInstance("root");

        // 获取私有构造方法
        Constructor constructor1 = clz.getDeclaredConstructor(String.class, String.class);
        System.out.println(constructor1);  // 私有 private cn.ysu.reflect.MySql(java.lang.String,java.lang.String)
        // 暴力破解
        constructor1.setAccessible(true);
        // 获取对象
        Object o1 = constructor1.newInstance("root", "123");
        System.out.println(o1); // cn.ysu.reflect.MySql@723279cf

        DataBase db = (DataBase) o;
        db.insert();

          // 获取抛出异常的构造方法 Class<?>[] getExceptionTypes()
//        Constructor constructor = clz.getConstructor(String.class);
//        Class[] exces = constructor.getExceptionTypes();
//        for (Class c : exces){
//            System.out.println(c);  // class java.lang.Exception
//        }

        // 获取public修饰的属性
        Field field = clz.getField("id");
        System.out.println(field);  // public java.lang.String cn.ysu.reflect.DataBase.id
        //  Object get(Object obj): 获取当前属性的值
        Object val = field.get(o);
        System.out.println(val);  // root
        // 设置属性值 void set(Object obj, Object value)
        field.set(o,"zss");
        System.out.println(field.get(o));  // zss

        Field field2 = clz.getDeclaredField("sql");
        // 暴力破解
        field2.setAccessible(true);
        field2.set(o1,"SELECT * FROM student");
        Object psw = field2.get(o1);
        System.out.println(psw);  // SELECT * FROM student

        // 获取方法
        Method method = clz.getMethod("insert");
        // 调用方法,需要指定调用的对象和参数值
        method.invoke(o);
        // 获取私有方法
        Method method1 = clz.getDeclaredMethod("delete");
        // 调用方法
        method1.setAccessible(true);
        // 获取方法返回值类型的对象
        Class c = method1.getReturnType();
        System.out.println(c);  // boolean
        Object oo = method1.invoke(o);
        System.out.println(oo);  // true

    }
}
abstract class DataBase{
    public String id;
    public String psw;
    public abstract void insert();
}

class MySql extends DataBase{

    private String sql;

    public MySql(String id) throws Exception {
        if (id == null){
            throw new Exception();
        }
        this.id = id;
        System.out.println("通过有参构造创建对象,一个参数");
    }

    private MySql(String id, String psw){
        this.psw = psw;
        this.id = id;
        System.out.println("通过有参构造创建对象,两个参数");
    }

    public void insert(){
        System.out.println("从Mysql数据库中插入数据");
    }

    private boolean delete(){
        System.out.println("从Mysql数据库中删除数据");
        return true;
    }
}

class Oracle extends DataBase{
    public void insert(){
        System.out.println("从Oracle数据库中插入数据");
    }
}

dataBase.properties文件内容

DBName = cn.sss.reflect.MySql

标签:反射,java,String,对象,十六,System,println,Class,out
来源: https://blog.csdn.net/weixin_39281866/article/details/121956153