反射机制--总结

1.反射的概念:

Reflection(反射) 被视为 动态语言的关键,反射机制允许程序在执行的时候借助Reflection的API 获取任何类的内部信息,直接操作任何对象的内部属性和方法。

2.Object类中定义Class 类:反射从程序允许结果看:利用Java编译生成.class文件反编译原来的Java---通过对象反射求出类的名称

 

1). 反射的理解:反射通过动态的设置内部的属性和方法,在反射的过程中,我们事先不知道 类的名称是什么,采用getClass() 方法获取一个实体的类型---在JavaBean过程中反射的类必须有一个无参的构造器:同时在反射的时候属性和方法的名称保持一致

对getClass(): Object 类一个方法名叫getClass,利用该方法获取一个实例的 类型类 类型类指的是代表一个类型的类,String类型的类String.class

java 中所有的类型类是Class的实体

   getClass():一个类的实例具备的方法.getClass() 是动态的;解释:返回这个对象正在运行是的类,直到这个对象属于什么类

   Class()方法是一个类的方法是静态的方法

总结:

1. 对Class 实例的理解

正常情况:创建一个类,通过编译(javac.exe),生成对应的class文件,之后使用Java.exe(JVm 类加载器)运行.class 文件

反射情况:此class文件加载到内存以后就是一个运行时类 , 存在缓存区域,那么此运行时类就是一个Class 的实例;对某个对象.getClass() 为了得到这个运行时类  注意每一个运行类只加载一次  Person.Java--编译--Person.class(Class 的实例)

2.获取Class 实例 clazz作用:

1).创建对应的运行时类的对象 clazz.newInstance();

2).对应运行时类的完整结构

3).调用指定的属性,方法和构造器

4).反射的应用 动态的代理



1.Java中有四种方法获取反射的机制:

1.调用运行时类的本身的.class的属性:静态

Class clazz=Person.class;

2.通过运行时对象获取:动态

Person per=new Person();

Class clazz=per.getClass();

3. 通过Class 的静态的方法

Class.forName("com.atug.Person");

4.通过类的加载器

Class clazz=this.getClass().getClassLoader().loadClass("com.atug.Person");

 1    Person person=new Person();
 2         // 1.第一种方式通过Object的getClass() 方法(需要实例化一个对象)
 3         Class clazz1=person.getClass();
 4
 5         // 2.通过对象实例方法获取(需要实例化一个对象)
 6         Class clazz2=Person.class;
 7
 8         // 类的全路径
 9         try {
10             Class clazz3=Class.forName("com.atug.reflection_1.Person");
11         } catch (ClassNotFoundException e) {
12             // TODO Auto-generated catch block
13             e.printStackTrace();
14         }
15         

2.Class 实例第一种作用:

2.1创建类的对象:调用Class对象的new Instance()的方法:

1)类必须误差构造器  2).类的构造器的访问权限必须足够

反射类没有空的构造器,报错 ;类的构造器是非private权限

通过反射获取对象的内部成员的属性,不理睬private

 1 // 1.第一种方式通过Object的getClass() 方法(需要实例化一个对象)
 2           Class clazz=Person.class;
 3
 4           5          //.getFields 只能获取其中 public属性
 6           Field[] fields=clazz.getDeclaredFields();
 7
 8           for(Field fi:fields)
 9           {
10               System.out.println(fi.getName());
11           }
12
13           //同样获取运行的方法
14           Method[] m1=clazz.getDeclaredMethods();
15           for(Method m:m1)
16           {
17               System.out.println(m.getName());
18           }
19           

事实上:利用反射的主要目的不在获取内部属性或者是内部方法名称 在于利用反射动态的建立一个对象,在其中设置成员属性和调用其中成员方法

2.2. 因此首先 反射动态的建立一个类的对象 Person p=clazz.newInstance(); 调用类型方法时候注意private 同时Method.invoke() 启动反射建立的实例的方法

 1  // 利用反射的主要目的不在获取内部属性或者是内部方法名称 在于利用反射动态的建立一个对象,在其中设置成员属性和调用其中成员方法
 2           // 1.利用反射调用指定的属性  私有成员Declared
 3           Person p=(Person) clazz.newInstance();
 4           Field f1=clazz.getDeclaredField("name");
 5           f1.setAccessible(true);
 6           f1.set(p,"HuHui");
 7           System.out.println(p);
 8
 9           // 2.利用反射生成某个实例调用其中的方法 paramterTypes=show 类型 void null
10           Method M1=clazz.getDeclaredMethod("show");
11           M1.setAccessible(true);
12           M1.invoke(p);

4.对加载器的理解:

程序主动使用某个类的时候,该类没有被加载到内存,使用getClassLoader().loadClass();

类加载器将类加载到内存:启动型加载器和自定义加载器

Java核心库String是引导类加载器

使用类加载器从 某个目录下得得到 properties

 1 ClassLoader loader1=this.getClass().getClassLoader();
 2         System.out.println(loader1);
 3         // 类加载器加载某个目录下的Java
 4         InputStream is=loader1.getResourceAsStream("com\\atug\\properties");
 5         // 当前工作空间小
 6         FileInputStream in=new FileInputStream(new File("jdbc.properties"));
 7         Properties pro=new Properties();
 8         pro.load(is);
 9
10         String name=pro.getProperty("XXX");
11     }


3.反射第二个事情: 反射获取类的完整的结构:实现全部接口,所继承的父类 全部的Field

常用反射获取泛型的类型

3.1 获取属性,获取权限修饰符 变量类型 变量名



 1         Class clazz=Person.class;
 2
 3         //Person 类比较的复杂继承 和泛型接口
 4         Field [] fields=clazz.getFields();
 5
 6         // 查看一下getFields 只能获取运行本类和父类中声明public属性 null
 7         for(Field field:fields)
 8         {
 9             System.out.println(field.getName());
10         }
11
12         // 2. 获取所有声明的属性,如果修改属性值必须field.setAccessible(arg0);
13         Field [] fields1=clazz.getDeclaredFields();
14         for(Field field:fields1)
15         {
16
17             System.out.println(field);
18
19             System.out.println(field.getName());
20             // 1.获取修饰符
21             System.out.println(Modifier.toString(field.getModifiers()));
22
23             // 2.获取属性的类型:
24             Class Type=field.getType();
25             System.out.println(Type.getName());

 

3.2 获取运行时候的父类---发现得到父类的名称 父类有泛型并没有显示出来

1 Class clazz=Person.class;
2
3         Class superClass=clazz.getSuperclass();
4         System.out.println(superClass.getName());

3.3 获取带泛型的父类 父类的类型: getGenericsuperClass();获取父类泛型--返回Type类型

 1 Class clazz=Person.class;
 2         Type type=clazz.getGenericSuperclass();
 3
 4         System.out.println(type);
 5
 6         //--------重点:获取父类的泛型 String-----
 7         // ParameterizedType 是Type的子类 --带有参数化的Type
 8
 9         if(type instanceof ParameterizedType)
10         {
11              ParameterizedType param=( ParameterizedType)type;
12
13              // 获取带参数Type 中实际参数类型 返回数组有多个参数
14              Type[] types=param.getActualTypeArguments();
15              if(types[0] instanceof Class)
16                     System.out.println(types[0].getTypeName());
17         }

DAO 直到操作的那个类,获取父类的泛型 反射建立对象将SQL中数据存到JavaBean中。

时间: 2024-08-03 05:49:23

反射机制--总结的相关文章

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

Java反射机制

Java的反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 反射的作用 1 可以反编译将class文件编译成java文件 2 可以通过反射机制访问Java对象的属性,方法,构造方法等 反射机制使用步骤 1 得到要调用类的class 2 通过得到的c

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

使用反射机制调用属性和私有成员与代理模式的介绍

使用反射机制调用属性: 通过反射机制可以获得类的属性,获得到的属性同样的可以进行赋值.得值操作,调用getField方法并传递属性的名称可以获得[学Java,到凯哥学堂kaige123.com]指定的属性,调用getFields方法则可以获得全部属性,但是这种方式不能获得私有属性: 代码示例: Student类示例: 运行结果: 从运行结果可以看出只拿出了公开的属性,私有的属性拿不到. 使用反射机制调用私有成员: 1.调用私有属性 在反射机制里调用私有属性需要通过getDeclaredField

反射机制

反射机制: 反射机制是能够帮助我们把代码变得更加灵活,可扩展性更高,俗称"软编程.软写法".例如:有一个文件里面有一些值,想要把这些值赋值到一个Student类的属性中,按照以前所学到的知识点,只能是通过文件流将文件里的值读取出来,然后再通过set方法将这些值都赋给Student类的属性.但是,这种方式是将代码写死了,在这之后会有一个问题就是如果文件里的内容发生变动,或者要把这个Student类更换成Dog类的话,就要重新修改代码.程序写好了部署到服务器上运行了,总不能时不时就打开来修

Python学习心得(六) 反射机制、装饰器

1.反射机制 #/usr/bin/env python # -*- coding:utf-8 -*- ''' Python反射机制的核心本质:利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动 通俗讲就是通过用户传入url的不同,调用不同的模块函数,好多比较流行的web框架都是通过反射的机制,根据url的不同指向不同的模块 getattr(),hasattr(),setattr(),delattr()对模块的修改都在内存中进行,并不会影响文件中的真实内容

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的

Java的反射机制简述

反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许内部的成员进行操作.虽然这个特性在实际开发中使用的不多,但是像Pascal.C和C++等语言根本没有提供这样的特性.由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制也会严重影响系统的性能. 具体而言,反射机制提供的功能主要有: 1.得到一个对象所属的类: 2.获取一个类的所有成员变量和方法: 3.在运行时创建对象: 4.在运行时调用对象的方法. 其实,反射机制非常重要

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i