Java反射初探

反射从字面意思理解就是通过某一个影子来实现对原物体的操作,在java里面,也是这个意思,通过

这个反射的影子来实现对实际的世界的事物的操作.那么如何来创建这个反射的影子对象了,我们使用的就是Class关键字来实现

反射也同时在Java.lang包下的。在使用的时候,必须的要导入java.lang包。下面,我们来看看Java反射的第一步,就是获取影子对象。有三种方法来获取影子对象.代码如下.

public class DemoRefaction {
    public static void main(String[] args) {
        //使用getclass方法来实现的,看看下面的代码,先创建对象,在调用方法
        //调用。class属性来实现.
        //第三种方法就是直接classname提供的静态方法来实现的。
        Object obj = new Object();
        Class c1 = obj.getClass();
        System.out.println("c1的hascode数值为+" + c1.hashCode());


        Class c2 = Object.class;
        System.out.println("c2的hascode数值为+" + c2.hashCode());
        //第三种方法.
        try {
            Class c3 = Class.forName("java.lang.Object");
            System.out.println("c3的hascode数值为+" + c3.hashCode());
            System.out.println("c1和c2是否相等" + c1.equals(c2));
            System.out.println("c1和c2是否相等" + c1.equals(c3));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


    }
}

很明显在第一种方法的缺点就是还必须要创建对象来实现,第二种方法就是调用Object基类的.class方法来实现对影子对象的创建,最后一种方法,什么都不需要,只是需要传入一个参数就是类的全名就可以了。自由度更高.在一般的开发里面我们一般使用第三种情况来实现对影子对象的创建。

假如,我们获得了影子对象,那么我们如何操作该对象,也就是获取实际对象的属性,方法,以及构造方法了。

下面我们来看看代码.

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class DemoTest {
    public static void main(String[] args) {
        try {
            Class c = Class.forName("DemoTestExample");
            Method ms[] = c.getDeclaredMethods();
            for (Method m : ms) {
                System.out.print(Modifier.toString(m.getModifiers()) + " ");
                //获取方法的修饰符
                //获取方法的返回的名字。
                System.out.print(m.getReturnType().getSimpleName() + " ");
                //获取方法的名字.
                System.out.print(m.getName() + "(");
                //获取参数.注意返回的就是一个Class类型的数组,注意这里的Class式大写.
                Class paras[] = m.getParameterTypes();
                for (int i = 0; i < paras.length; i++) {
                    //输出方法的参数.getSimpleName式以简化的名字的方式来去实现的。
                    System.out.print(paras[i].getSimpleName() + " arg ");
                    if (i < paras.length - 1) {
                        System.out.print(",");
                    }

                }
                //输出一个换行。
                System.out.print(")");
                //获取抛出的异常.
                Class excs[] = m.getExceptionTypes();
                for (int i = 0; i < excs.length; i++) {
                    //输出异常的名字.
                    System.out.println(excs[i].getSimpleName());
                    //如果不是最后一个异常的话.
                    if (i < excs.length - 1) {
                        System.out.println(",");
                    }
                }
                System.out.print(" ");
                System.out.println("{ }");
            }

            try {
                //调用一个无参数的构造方法getConstructor来创建一个对象.
                Constructor cs = c.getConstructor();
                //创建一个实例.
                try {
                    Object obj = cs.newInstance();
                    Method m = c.getDeclaredMethod("add", int.class, int.class);
                    //当一个类里面的成员方法被修饰为私有的时候,我们如果向使用该方法的时候,必须设置权限
                    //如下代码。
                    m.setAccessible(true);
                    m.invoke(obj, 189, -100);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }


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

            //获取方法的对象.
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

 

public class DemoTestExample {
    private void add(int a, int b) {
        System.out.println("a+b=" + (a + b));
    }
}

代码注释的非常清楚,这里,就不再多说了。下面我们看看如何获取构造方法。来看看下面的代码.

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;

public class GetConstructor {
    //如何利用反射获取取构造方法.
    public static void main(String[] args) {
        try {
            Class data = Class.forName("testonsture");
            //利用影子对象获取所有的构造器和构造方法.
            Constructor[] arr = data.getDeclaredConstructors();
            for (Constructor con : arr) {
                //遍历获取的所哟䣌构造器。
                System.out.print(Modifier.toString(con.getModifiers()) + " ");
                //获取所有构造器的修饰符.
                //获取方法的名字.
                System.out.print(con.getName() + " ( ");
                //获取方法的参数.返回的就是一个Classs数组.
                Class[] ars = con.getParameterTypes();
                for (int i = 0; i < ars.length; i++) {
                    //获取参数的类型,以及参数的名字
                    System.out.print(ars[i].getSimpleName() + " args ");
                    if (i < ars.length - 1) {
                        System.out.print(",");
                    }

                }
                System.out.println(") { }");

                //获取构造方法.
                try {
                    Constructor cs = data.getConstructor();
                    //调用无参数的构造方法.获取哟个object对象.
                    try {
                        Object obj = cs.newInstance();
                        //创建一个object对象.父类调用子类的方法,就会显示子类重写的效果.
                       System.out.println(obj.toString());

                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }


                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }
                try {
                    Constructor cs1 = data.getConstructor(int.class,String.class,double.class);
                    //获取操作权限.
                    cs1.setAccessible(true);
                    try {
                        Object obj2= cs1.newInstance(-1,"反射","12.34");
                        System.out.print(obj2.toString());
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }

            }

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


}

 

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍基于Matlab代码实现的四轴飞行器动力学建模与仿真方法。研究构建了考虑非线性特性的飞行器数学模型,涵盖姿态动力学与运动学方程,实现了三自由度(滚转、俯仰、偏航)的精确模拟。文中详细阐述了系统建模过程、控制算法设计思路及仿真结果分析,帮助读者深入理解四轴飞行器的飞行动力学特性与控制机制;同时,该模拟器可用于算法验证、控制器设计与教学实验。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及无人机相关领域的工程技术人员,尤其适合从事飞行器建模、控制算法开发的研究生和初级研究人员。; 使用场景及目标:①用于四轴飞行器非线性动力学特性的学习与仿真验证;②作为控制器(如PID、LQR、MPC等)设计与测试的仿真平台;③支持无人机控制系统教学与科研项目开发,提升对姿态控制与系统仿真的理解。; 阅读建议:建议读者结合Matlab代码逐模块分析,重点关注动力学方程的推导与实现方式,动手运行并调试仿真程序,以加深对飞行器姿态控制过程的理解。同时可扩展为六自由度模型或加入外部干扰以增强仿真真实性。
基于分布式模型预测控制DMPC的多智能体点对点过渡轨迹生成研究(Matlab代码实现)内容概要:本文围绕“基于分布式模型预测控制(DMPC)的多智能体点对点过渡轨迹生成研究”展开,重点介绍如何利用DMPC方法实现多智能体系统在复杂环境下的协同轨迹规划与控制。文中结合Matlab代码实现,详细阐述了DMPC的基本原理、数学建模过程以及在多智能体系统中的具体应用,涵盖点对点转移、避障处理、状态约束与通信拓扑等关键技术环节。研究强调算法的分布式特性,提升系统的可扩展性与鲁棒性,适用于多无人机、无人车编队等场景。同时,文档列举了大量相关科研方向与代码资源,展示了DMPC在路径规划、协同控制、电力系统、信号处理等多领域的广泛应用。; 适合人群:具备一定自动化、控制理论或机器人学基础的研究生、科研人员及从事智能系统开发的工程技术人员;熟悉Matlab/Simulink仿真环境,对多智能体协同控制、优化算法有一定兴趣或研究需求的人员。; 使用场景及目标:①用于多智能体系统的轨迹生成与协同控制研究,如无人机集群、无人驾驶车队等;②作为DMPC算法学习与仿真实践的参考资料,帮助理解分布式优化与模型预测控制的结合机制;③支撑科研论文复现、毕业设计或项目开发中的算法验证与性能对比。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注DMPC的优化建模、约束处理与信息交互机制;按文档结构逐步学习,同时参考文中提及的路径规划、协同控制等相关案例,加深对分布式控制系统的整体理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值