java 深入技术七(类的结构和反射)
1.java反射(reflect)
java 类的结构
java反射机制就是把java类按结构分解,每一部分对应特定的反射类
java反射机制允许运行时加载,探知和使用在编译期间完全未知的classes,换句话说,java程序可以加载一个运行时才得知名称的class,获悉其完整结构信息
一个.class类对应一个Class反射类
字段对应一个反射类Field
Field类的对象是 字段
构造函数对应一个反射类Constructor
方法对应一个反射类Method
2. _Class类
代表一个.class文件
Class forName(String className) //通过类的全类名加载该类 手动的加载一个类
全类名:包名+类名
Constructor getConstructor(Class...parameterTypes) //获取一个类内部的构造函数
parameterTypes //参数类型 用public修饰的构造函数
Constructor[] getConstructors() //获得所有的public构造函数,包括父类的
Constructor getDeclaredConstructor(Class...parameterTypes) //获得自定义的构造函数
Constructor getDeclaredConstructors() //获得类自己声明的所有构造函数,包括私有的private
Class.getConstructor(String name,int age)
Field getField(String name) //获得字段
Field[] getFields() //获得所有的public字段,包括父类的
Field getDeclaredField(String name) //获得自定义的字段
Field[] getDeclaredFields() //获得类自己声明的所有字段
Method getMethod(String name,Class...parameterTypes) //方法的类型
Method[] getMethods[] //获得所有的public方法
Method getDeclaredMethod(String name,Class...parameterTypes)
Method[] getDeclaredMethods() //获得自己声明的所有方法
Package getPackage() //获得此类的包的对象
int getModifiers() //获得此类的修饰符
String getName() //获得此类的名称
Object newInstance() //使用无参数构造方法创建此类的对象
Class 类的实例表示正在运行的java程序的类和结构
枚举是一种类,注释是一种接口
java.lang 包下的类
1).首先获得Class对象加载类:直接类名.class
类对象.getClass()
Class.forName(包名+类名)
2).通过Class对象获得类的构造方法,字段,方法
3).通过Class对象获得类的包名,getPackage()
3._Constructor类
Constructor表示一个类的构造函数的对象
**Object newInstance(Object...inittargs) //创建一个对应类的对象,可变参数:有参或无参
构造函数是有参数的
Class[] getParameterTypes() //获得所有参数的类型
String getName() //获得构造函数名称
int getModifiers() //获得此构造函数的修饰符(public private protected)
Class[] getExceptionTypes() //获得此构造函数声明,抛出的异常类型
Object getAnnotation(Class annotationClass) //获得注释对象
4._Field类
表示一个类的字段
**Class getType() //获得此字段的类型
Class getDeclaringClass() // 获得声明此字段的类的类型
String getName() //获得此字段的名称
int getModifiers() //获得此字段的修饰符
**Object get (Object obj) //获得此字段在指定对象中的值
boolean getBoolean(Object obj) //获得此字段在指定对象中的布尔值
byte getByte(Object obj) //获得byte值
**void set(Object obj,Object value) //设置此字段在指定对象中的值
void setBoolean(Object obj,boolean z)
AccessibleObject
取消反射对象(Constructor,Fields,Method)的访问限制
void setAccessible(boolean flag)
java 对象的序列化会使用到此特性
5._Method 类
对应类中的方法
Class getDeclaringClass() //获得声明此方法的类的Class对象
Class[] getExceptionTypes() //获得此方法声明抛出的异常类型
int getModifers() //获得此方法的修饰符
String getName() //获得此方法的名称
Class[] getParameterTypes() // 获得此方法的参数的类型
Class getReturnType() //获得此方法的返回值类型
Objectinvoke(Object obj,Object...args) //使用指定对象调用此方法Method对应的对象
objPerson类的一个对象
创建类的对象
1. Class clazz=Person.class;
clazz.newInstance();
2. Construnctor constructor=clazz.getDeclaredConstructor();
constructor.newInstance();
6.Modifier 类
专门代表一个修饰符(方法,或类的修饰符)
static int abstract final interface native private protected public
static boolean isPublic isPrivate isProtected
总结
构造函数:无参和有参
Class clazz = Class.forName("com.reflect.Person");
// 通过Class对象获得Constructor类对象
Constructor constructor = clazz.getDeclaredConstructor();
// 有两个参数的构造函数
Constructor constructor2 = clazz.getConstructor(String.class,
Integer.class);
//有参的对象
Object o2 = constructor2.newInstance("李丹", 30);
//无参的对象
Object o = constructor.newInstance();
字段:
Field nameField = clazz.getDeclaredField("name");
// 取消private访问限制
nameField.setAccessible(true);
nameField.set(person, "蛋蛋");
Person person = (Person) clazz.newInstance();
//获得Person类中的name字段
Object o = nameField.get(person);
方法:有参和无参,还有方法的调用
// 根据方法名获得指定的方法
Method sayHello = clazz.getDeclaredMethod("sayHello");
//对象调用参数
Person person = (Person) clazz.newInstance();
sayHello.invoke(person);
Method singMethod = clazz.getDeclaredMethod("sing", String.class);
Person person = (Person) clazz.newInstance();
// 对象调用sing方法
singMethod.invoke(person, "小苹果");
10.java 反射可以做什么
1.java对象的序列化
2.封装框架提供通用功能
3.为程序提供扩展功能
java 深入技术七(类的结构和反射)的更多相关文章
- java agent技术原理及简单实现
注:本文定义-在函数执行前后增加对应的逻辑的操作统称为MOCK 1.引子 在某天与QA同学进行沟通时,发现QA同学有针对某个方法调用时,有让该方法停止一段时间的需求,我对这部分的功能实现非常好奇,因此 ...
- java类的结构(属性、方法、构造函数)
一.类的定义形式类定义的一般形式如下 [类定义修饰符] class <类名> { //类体 [成员变量声明] [构造函数] [成员方法] } 前面说过,在描述java语法时,方括号中 ...
- 如莲开发平台(MIS基础框架、Java技术、B/S结构)
关于 「如莲」是一套MIS类系统基础框架,主要用于各类“管理信息系统”的开发,也适合做网站后台开发.可省去开发时的框架搭建.规范约定.权限管理等基础工作,直接专注于业务功能实现. 「如 ...
- 【Java】类的结构
类与对象 类中主要包括五种结构,下面进行对这五种结构进行详细的介绍. 1. 面向对象与面向过程 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做. 面向对象:强调具备了功能的对象,以类/对象为 ...
- Java进阶(七)Java加密技术之非对称加密算法RSA
Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...
- 【基本功】Java动态追踪技术探究 不重启JVM,替换掉已经加载的类?不重启JVM,获知运行时对象的属性
https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA 小结: 1.根据Java的类加载机制,在同一个ClassLoader中,类是不允许重复的: 2.单例 ...
- 构造方法,重载,static,math类(java基础知识七)
1.构造方法概述和格式 * A:构造方法概述和作用 * 给对象的数据(属性)进行初始化 * B:构造方法格式特点 * a:方法名与类名相同(大小也要与类名一致) * b:没有返 ...
- OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构
最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...
- java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包
首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...
随机推荐
- 冰冻三尺非一日之寒--Django框架【进阶篇】
第十九章 Django进阶 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
- 北京培训记day5
高级数据结构 一.左偏树&斜堆 orz黄源河论文 合并,插入,删除根节点 打标记 struct Node { int fa,l,r,w,dep } tree[Mx]; int Merge(in ...
- 编译OpenCV文档
概述 使用OpenCV的过程中经常查看文档,每次都去官网查看,不过国内访问速度很慢,有一份本地的文档就好了.本文列出了在Linux(Fedora)系统上从OpenCV源码编译出documentatio ...
- 数据结构作业——buzhidao(队列)
buzhidao Description 有一个长度为 n 的序列,第 i 个数的大小为 a[i].现在从第 1 个数开始从左往右进行以下操作:1. 如果当前数是剩下的数中最大的,则输出并删去这个数. ...
- POJ 1797 Heavy Transportation(最大生成树/最短路变形)
传送门 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 31882 Accept ...
- SAM初探
SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...
- ORM之殇,我们需要什么样的ORM框架?
最近在研究ORM,究竟什么样的框架才是我们想要的 开发框架的意义在于 开发更标准,更统一,不会因为不同人写的代码不一样 开发效率更高,无需重新造轮子,重复无用的代码,同时简化开发流程 运行效率得到控制 ...
- Hibernate配置方式
Hibernate配置方式 Hibernate给人的感受是灵活的,要达到同一个目的,我们可以使用几种不同的办法.就拿Hibernate配置来说,常用的有如下三种方式,任选其一. 在 hibernate ...
- 2.5多重else嵌套的二次方程求根
#include<stdio.h> #include<math.h> int main() { double a, b, c, disc, x1, x2, realpart, ...
- 利用Tomcat内置的servlet实现文件下载功能
起因 最近博客所在的VPS挂了又要重装系统,又要重装各种软件. 以前我也经常更换VPS,每次更换都是各种坑爹事情..比如要下载java.下载tomcat.下载mysql..........以前每次我都 ...