Java语言之认识反射以及反射与类的操作

本文深入解析Java反射机制,包括如何通过反射获取类信息、实例化对象、调用构造方法、普通方法及类属性,展示了反射在Java编程中的强大功能。

(一)认识反射 

反射:对象的反象处理.所谓"反"是指根据对象来取得对象的来源信息,而这个"反"操作核心处理的就在于Object类的一个方法:

1.取得Class类对象

public final native Class<?> getClass();

示例:

public class Test {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date.getClass());
    }
}

在反射中,看重的不是对象,而是身后的组成(类,构造,普通,成员等)

2.实例化对象: 

(1)任何类的实例化对象都可以通过Object类中的getCLass()方法取得;
(2)"类.class":直接提供具体类来取得类的实例化对象.
(3)使用Class类提供的方法:public static Class<?> forName(String className);

示例:

(2)
class Person{
    private String name;

}
public class Test {
    public static void main(String[] args) {
      System.out.println(Person.class);
    }
}


(3)
public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
      Class<?> slc = Class.forName("java.util.Date");
      System.out.println(slc.getName());
    }
}

反射实例化对象:

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
      Class<?> slc = Class.forName("java.util.Date");
      Object object = slc.newInstance();//实例化
      System.out.println(object);
    }
}

(二)反射与类的操作

注:利用反射可以做出一个对象具备的所有操作行为,最为关键的是这一切的操作都基于Object类

1.获取父类信息

在java中任何程序类一定有父类,在Class类中就可以通过该方法获取父类或者实现的父接口:

获取类的包名称:public Package getPackage();

获取父类的Class对象:public native Class<? super T> getSuperClass();

获取实现的父接口:public Class<?>[] getInterfaces();
interface IFruit{}
interface IMessage{}
class CLS implements IFruit,IMessage{}
public class Test {
    public static void main(String[] args) {
       Class<?> cls = CLS.class;
       //取得类的包名称
       System.out.println(cls.getPackage().getName());
       //取得父类的名称
       System.out.println(cls.getSuperclass().getName());
       //取得实现接口的对象
        Class<?>[] classes = cls.getInterfaces();
       for (Class<?> classes1:classes){
           System.out.println(classes1);
       }
    }
}

2.反射调用构造方法:

(1)取得指定参数的构造方法:
public Constructor<T> getConstructor(Class<?>...parameterTypes);

(2)取得类中所有的构造方法:
public Constructor<T>[] getConstructor();
class Person{
    public Person(){}
    public Person(String name){}
    public Person(String name,int age){}
}
public class Test {
    public static void main(String[] args) throws NoSuchMethodException {
      Class<?> cls = Person.class;
      //指定参数类型构造
      Constructor<?> constructor = cls.getConstructor(String.class,int.class);
      System.out.println(constructor);
      //所有参数类型构造
      Constructor<?>[] constructors = cls.getConstructors();
      for (Constructor<?> constructor1:constructors){
          System.out.println(constructor1);
      }
    }
}

注:在定义简单Java类是一定要保留一个无参数的构造.

Class类通过反射实例化类对象的时候,只能调用类中的无参构造.如果类中没有无参构造则无法使用Class类调用,只能通过明确的构造调用实例化处理.

3.反射调用普通方法:

(1)取得全部普通方法:
public Method[] getMethod();

(2)取得指定普通方法:
public Method[] getMethod(String name,Class<?>...paramaterTypes);
class Person{
    private String name;
    private int age;
    public Person(){}
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

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

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person [name="+this.name+" "+"age="+this.age+"]";
    }
}
public class Test {
    public static void main(String[] args) throws NoSuchMethodException {
      Class<?> cls = Person.class;
      //取得指定普通方法
      Method method = cls.getMethod("setName", String.class);
      System.out.println(method);
      //取得全部普通方法
      Method[] methods = cls.getMethods();
      for (Method methods1:methods){
          System.out.println(methods1);
      }
    }
}

4.反射调用类属性:

父类中:
(1)取得全部属性:public Field[] getFields();

(2)取得类中指定名称属性:public Field[] getFields(String name);

子类中:
(1)取得全部属性:public Field[] getDeclaredFields();

(2)取得类中指定名称属性:public Method getDeclaredFields(String name,Class<?>...parameterTypes);


class Person{
    private String name;
}
class Student extends Person{
    private int age;
}
public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
         Class<?> cls = Class.forName("exicise.Student");
         //获取父类的的全部属性
        {
            Field[] fields = cls.getFields();
            for (Field field:fields){
                System.out.println(field);
            }
        }
        
        //获取本类中的所有属性
        System.out.println("____________");
        {
            Field[] fields = cls.getDeclaredFields();
            for (Field field:fields){
                System.out.println(field);
            }
        }
    }
}

注:类中所有属性必须在类对象实例化之后才进行空间分配,若想调用类中属性,必须保持实例化对象. 

class Person{
    private String name;
}
public class Test {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
         Class<?> cls = Class.forName("exicise.Person");
         Object object = cls.newInstance();//实例化
         Field nameField = cls.getDeclaredField("name");//操作属性
         nameField.set(object,"Bob");
         System.out.println(nameField.get(object));//取得属性
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

【完美复现】面向配电网韧性提升的移动储能预布局动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
先看效果: https://pan.quark.cn/s/3756295eddc9 在C#软件开发过程中,DateTimePicker组件被视为一种常见且关键的构成部分,它为用户提供了图形化的途径来选取日期时间。 此控件多应用于需要用户输入日期或时间数据的场景,例如日程管理、订单管理或时间记录等情境。 针对这一主题,我们将细致研究DateTimePicker的操作方法、具备的功能以及相关的C#编程理念。 DateTimePicker控件是由.NET Framework所支持的一种界面组件,适用于在Windows Forms应用程序中部署。 在构建阶段,程序员能够通过调整属性来设定其视觉形态及运作模式,诸如设定日期的显示格式、是否展现时间选项、预设的初始值等。 在执行阶段,用户能够通过点击日历图标的下拉列表来选定日期,或是在文本区域直接键入日期信息,随后按下Tab键或回车键以确认所选定的内容。 在C#语言中,DateTime结构是处理日期时间数据的核心,而DateTimePicker控件的值则表现为DateTime型的实例。 用户能够借助`Value`属性来读取或设定用户所选择的日期时间。 例如,以下代码片段展示了如何为DateTimePicker设定初始的日期值:```csharpDateTimePicker dateTimePicker = new DateTimePicker();dateTimePicker.Value = DateTime.Now;```再者,DateTimePicker控件还内置了事件响应机制,比如`ValueChanged`事件,当用户修改日期或时间时会自动激活。 开发者可以注册该事件以执行特定的功能,例如进行输入验证或更新关联的数据:``...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值