`

反射

    博客分类:
  • JDK
jdk 
阅读更多
1.反射:一个类有多个组成部分,例如,成员变量,成员方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。( 解析编译好之后的.class文件 )
  变成时什么情况下才需要加载类,并解剖出类的各个组成部分? 
当只有一个类的.class文件或不知道类的内部结构的时候,或只知道某个包名下的.class文件并且知道这个类里边大方法名称,需要反射,解析出需要的原有java类的成员变量,成员方法,构造方法等。

2.详解:
  2-1.反射的主要步骤:
      第一步:先加载类
      第二部:解析出所需类型的构造器
      第三部:创建解析出来的实体
      第四步:根据实体对象解析出实体对象里的成员方法或成员属性

  2-2. 加载类:java中有一个Class类用于代表某一个类的字节码,并且提供了加载某个类字节码的方法forName(),forName()方法用于加载某个类的字节码到内存中并使用.class对象进行封装,还有另外两种得到class对象的方式 :
     --- 类名.class,
     --- 对象.getClass()
    例:  //1.加载类--直接加载
          Class cla=Class.forName("cn.isoftstone.reflect.Student");
   
         //2.加载类--创建对象,调用.getClass
Student stu=new Student();
Class cla1= stu.getClass();

         //3.加载类--直接 类名.class
Class cla2=Student.class;

     2-3.实例演示:
public class Student {

/**单纯的声明一个变量那么它可以叫做一个字段,当这个字段有get方法返回的时候那么它就可以叫做属性
* 不声明字段,直接返回生命get方法的时候,例:getEmail()那么Email就是一个属性
* */
private String name;

private int sum; //字段
private String args[];
  
public String getEmail(){ //属性
return "zhangsansan@163.com";
}
public String getName(){
return name;
}
public Student() {
        //解析默认不带参数的构造器
}
private  Student(List list) {
//解析带List参数的构造器
}

public Student(String name, int age) {
//解析带基本数据类型参数的构造器
}
public Student(String str[]) {

}
   
public Student(String args[],double dou) {
//解析带数组参数的构造器
}
 
//返回无返回值不带参数的成员方法
public void study() {
System.out.println("学习中,请勿打扰 ... ... ");
}

//解析无返回值 带参数的成员方法
public void study(Integer i){
System.out.println(1);
}

//解析待返回值带参数的成员方法
public int getSum(int a,int b){
sum=a+b;
return sum;
}
   
//解析主方法
public static void main(String[] args) {
System.out.println("-------");
}
}
解析Student类的各种情况下的构造方法,Junit测试类:

@Test
public void test1() throws Exception{
//解析Student类

//1.加载类
Class cla=Class.forName("cn.isoftstone.reflect.Student");
//2.解析---通过无参数的构造器解析
Constructor constructor=cla.getConstructor(null);
//3.创建类的实例
Student entity=(Student) constructor.newInstance(null);
entity.study();
}

@Test
public void test2() throws Exception{
//解析带参数的构造器

//1.加载类
Class cla=Student.class;
//2.解析---通过带参数的构造器解析
Constructor constructor=cla.getConstructor(String.class,int.class);
    //3.创建类的实例
Student stu=(Student) constructor.newInstance("zhang sansan",90);
stu.study();
System.out.println(stu.getName());
}

@Test
public void test3(){
//怎么知道类中有哪些构造器

Class cla=Student.class;
Constructor csr[]=cla.getConstructors();
for(Constructor c:csr){
System.out.println(c.toGenericString());
}
}

@Test
public void test4()throws Exception{
//解析带数组参数的构造器 ---解析带数组的构造器,不能只有一个参数(jdk1.4 jdk1.5的区别) ...........
/* ---或者参数必须声明在外面 ,把数组强制造型成一个Object对象,如下:
String str[]={"a","b","c"};
Student stu=(Student) con.newInstance((Object)str);
*/
  Class cla=Class.forName("cn.isoftstone.reflect.Student");
  Constructor constructor=cla.getConstructor(String[].class,double.class);
  Student stu=(Student) constructor.newInstance(new String[]{"test","test1","test2"},9.0);
  stu.study();
}

@Test
public void test6() throws Exception{
//解析私有构造器,私有方法,私有属性要用getDeclaredConstructor(x.class),getDeclaredMethod(ClassObject)解析
Class cla=Class.forName("cn.isoftstone.reflect.Student");
Constructor con=cla.getDeclaredConstructor(List.class);
con.setAccessible(true); //暴力访问 ,强制修改访问权限

Student stu=(Student) con.newInstance(new ArrayList());

stu.study();
}

@Test
public void test8() throws Exception{//解析Student类中固定的成员方法
/**
*  注:如果解析的是private的私有成员方法,那么解析成员方法的时候要用getDeclaredMethod()方法,
* 然后Method对象调用setAccessible(true)方法强制执行反射
* */
Class cla=Student.class;
Student entity=(Student) cla.newInstance();//解析出实体对象的新实例,使用con.newInstance()方法的时候,必须保证Student类中有一个无参的构造方法

//1.解析出所有的成员方法,并遍历
Method methods[]=cla.getMethods();
for(Method method:methods){
System.out.println(method.toGenericString());
}

//2.解析不带返回值 不带参数的成员方法
Method mt1=cla.getMethod("study",null); //解析出目标成员方法,第二个参数是待解析方法的参数数据类型
mt1.invoke(entity,null);//执行解析出的成员方法,第一个参数是方法对应的实体对象,第二个参数是给待解析方法传的值

//3.解析不带返回值的成员方法
Method mt2=cla.getMethod("study",Integer.class); //解析出目标成员方法,第二个参数是待解析方法的参数数据类型
mt2.invoke(entity, 1);//执行解析出的成员方法,第一个参数是方法对应的实体对象,第二个参数是给待解析方法传的值

//4.解析带返回值 带参数的成员方法
Method mt3=cla.getMethod("getSum",int.class,int.class);
Object obj=mt3.invoke(entity, 2,3);//返回的是一个Object
System.out.println(obj);

/**解析主函数main函数  
* jdk1.4 -- main(String args[])当做数组来处理
* jdk1.5 -- main(String...str )当做可变参数来处理
* */
Method mt4=cla.getMethod("main",String[].class);
mt4.invoke(entity, new Object[]{new String[]{"aa"}});

/*或  String args[]={};
     mt4.invoke(entity, (Object)args);
*/
}


@Test
public void test9() throws Exception{ //解析成员属性或字段,注,解析的成员属性必须是定义好的
Class cla=Class.forName("cn.isoftstone.reflect.Student");
Student entity=(Student) cla.newInstance();

//1.解析所有的成员属性,解析私有的成员属性调用getDeclaredFields()方法,然后强制执行
Field fields[]=cla.getDeclaredFields();
for(Field field:fields){
field.setAccessible(true);//强制执行
System.out.println(field.getName());
}

//2.解析并操作字段或属性---例:赋值
Field fd1=cla.getDeclaredField("name");
fd1.setAccessible(true);
fd1.set(entity, "zhangsansan");//赋值
//System.out.println(stu.getName());//直接通过实体对象的get方法获取值---X
String value=(String) fd1.get(entity);//通过实体对象获取值
System.out.println(value);
}
分享到:
评论

相关推荐

    matlab计算反射阵单元相位(460652)_matlab反射阵相位_matlab反射阵_反射阵matlab_反射阵

    在本文中,我们将深入探讨如何使用MATLAB进行反射阵天线单元相位的计算,这是无线通信和雷达系统中的一个重要概念。MATLAB是一种强大的数学计算软件,尤其适用于数值分析和算法开发,因此它是处理此类问题的理想工具...

    P波入射C程序_P波反射系数计算_反射系数_

    对于P波来说,有两个重要的反射系数:P波反射系数(用于P波的反射)和SV波反射系数(用于剪切波,即S波的垂直分量的反射)。这里我们主要关注P波反射系数。 P波反射系数(R_PP)的计算公式为: \[ R_{PP} = \frac{\...

    光纤Bragg光栅反射谱

    光纤Bragg光栅(FBG)是一种在光纤内部制造的光学元件,它利用光的布拉格反射原理工作。这种光栅能够在特定的波长上反射光,而在其他波长上则允许光通过,因此在光纤通信、传感器和光谱学等领域有广泛应用。下面将...

    computing-reflecting-series.rar_反射波 matlab_反射系数褶积_反射系数设计_合成地震_地震

    本压缩包"computing-reflecting-series.rar"提供了一种使用MATLAB进行反射波模拟和处理的方法,主要涉及以下几个核心知识点: 1. 反射波:在地球内部不同介质的界面,地震波会部分反射,部分透射。这些反射波携带了...

    goa3D.rar_3D蒙特卡洛_matlab光线追迹_光线反射_反射_蒙特卡洛反射

    《3D蒙特卡洛光线追迹:MATLAB实现光线反射与散射解析》 在计算机图形学领域,光线追迹是一种广泛应用于渲染的技术,它模拟光线如何在虚拟环境中传播,从而产生逼真的图像效果。当涉及到3D空间中的复杂光学现象时,...

    Unity镜面反射脚本

    unity镜面反射脚本,包里4个文件 Mirror.cs :与shader互动的脚本,使用这组材质同时要把这个脚本拖给使用的物体才能生效 Mirror-BumpSpec.shader 实时镜面反射shader 可以配合法线贴图一起用 适用于平面物体 ...

    计算多层媒质的反射和透射系数,多层介质膜的反射率,matlab

    在IT领域,尤其是在电磁学和信号处理中,计算多层媒质的反射和透射系数是一项重要的任务。这个过程涉及到对电磁波在不同介质界面之间的交互进行数学建模,以便理解光、无线电波或其他电磁辐射如何在不同材料之间传播...

    Java常用的反射方法

    反射获取Class类对象的三种方法 2.1 通过全类名的方式获取 2.2 类名.class 2.3 实例对象.getClass() 2.4 总结 3. 反射获取属性变量 3.1 获取所有public修饰符的成员变量 3.2 获取指定字段并赋值 3.3 获取...

    matlab模拟光的反射折射.pdf

    标题中的"matlab模拟光的反射折射.pdf"指的是使用MATLAB软件进行光学现象的模拟,具体是关于光的反射和折射。MATLAB是一款强大的数学计算和数据可视化软件,它可以用于创建复杂的模型和模拟实验,包括物理学中的光学...

    FBG反射谱仿真.docx

    根据提供的文档信息,本文将详细解释与FBG(光纤布拉格光栅)反射谱仿真的核心概念、原理以及具体的MATLAB实现方法。本篇内容主要包括以下几个方面: ### 一、FBG基本理论介绍 #### 1.1 FBG定义 FBG(Fiber Bragg ...

    C++反射机制实现

    在讨论C++反射机制实现的过程中,我们首先需要明确反射机制的概念和分类。反射的定义源自人工智能领域,它主要涉及到两种反射结构:结构反射和计算反射。结构反射侧重于元类与类之间的关系,计算反射则关注于计算...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    unity3D 镜面反射shader

    在Unity中,实现镜面反射的效果是通过Shader来完成的,Shader是一种编程语言,它可以控制场景中的物体如何在屏幕上显示。在本主题中,我们将深入探讨Unity3D中的镜面反射Shader及其实现。 镜面反射在图形学中是一个...

    各种光栅反射谱matlab仿真

    在光学领域,光栅反射谱是一种重要的实验技术,用于研究物质对不同波长光的反射特性。MATLAB作为一款强大的数值计算与可视化软件,被广泛应用于科学计算和工程仿真,包括光栅反射谱的模拟。以下将详细阐述光栅反射谱...

    多层膜_三层膜的反射率计算_石墨烯_

    标题中的“多层膜_三层膜的反射率计算_石墨烯_”指的是在光学领域中,关于多层薄膜(具体为三层膜)结构的反射率计算,特别是涉及到石墨烯这种材料的情况。石墨烯是一种由单层碳原子构成的二维材料,具有极高的电导...

    详解C# 利用反射根据类名创建类的实例对象

    “反射”其实就是利用程序集的元数据信息。 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。 1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = ...

    基于zemax的反射式系统的结构设计.docx

    在光学设计领域,Zemax是一款广泛使用的光学设计软件,它能帮助工程师们设计和优化各种光学系统,包括反射式系统。反射式系统是利用反射镜而不是透镜来聚焦光线的光学系统,通常用于天文望远镜、激光器、成像设备等...

    菲涅尔系数计算Matlab,菲涅尔反射系数公式,matlab

    在光学中,菲涅尔系数是描述光线在两种不同介质间反射和透射时的比例,对于理解光在界面的行为至关重要。这些系数是由法国物理学家奥古斯丁·菲涅尔所提出的,广泛应用于光学工程、通信、天文学等领域。 描述中提到...

Global site tag (gtag.js) - Google Analytics