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 深入技术七(类的结构和反射)的更多相关文章

  1. java agent技术原理及简单实现

    注:本文定义-在函数执行前后增加对应的逻辑的操作统称为MOCK 1.引子 在某天与QA同学进行沟通时,发现QA同学有针对某个方法调用时,有让该方法停止一段时间的需求,我对这部分的功能实现非常好奇,因此 ...

  2. java类的结构(属性、方法、构造函数)

    一.类的定义形式类定义的一般形式如下 [类定义修饰符] class  <类名> {   //类体 [成员变量声明] [构造函数] [成员方法] } 前面说过,在描述java语法时,方括号中 ...

  3. 如莲开发平台(MIS基础框架、Java技术、B/S结构)

    关于     「如莲」是一套MIS类系统基础框架,主要用于各类“管理信息系统”的开发,也适合做网站后台开发.可省去开发时的框架搭建.规范约定.权限管理等基础工作,直接专注于业务功能实现.     「如 ...

  4. 【Java】类的结构

    类与对象 类中主要包括五种结构,下面进行对这五种结构进行详细的介绍. 1. 面向对象与面向过程 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做. 面向对象:强调具备了功能的对象,以类/对象为 ...

  5. Java进阶(七)Java加密技术之非对称加密算法RSA

    Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...

  6. 【基本功】Java动态追踪技术探究 不重启JVM,替换掉已经加载的类?不重启JVM,获知运行时对象的属性

    https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA 小结: 1.根据Java的类加载机制,在同一个ClassLoader中,类是不允许重复的: 2.单例 ...

  7. 构造方法,重载,static,math类(java基础知识七)

    1.构造方法概述和格式 * A:构造方法概述和作用     * 给对象的数据(属性)进行初始化 * B:构造方法格式特点     * a:方法名与类名相同(大小也要与类名一致)     * b:没有返 ...

  8. OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构

    最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...

  9. java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包

    首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...

随机推荐

  1. 开发socketserver 以及定制开发自己的FTP服务器

    socket server 示例 #服务端程序 import socketserver class TcpHandler(socketserver.BaseRequestHandler): def h ...

  2. linux命令大全

     host 命令 1,这个命令可以让您来查看主机的 ip 信息, 2,如果您还想查看 DNS 记录,可以使用 -a 参数 3,如果您需要查看域名服务器或者 SOA 信息,可以使用 -C 参数,或者您可 ...

  3. Oracle11g字符集AL32UTF8修改为ZHS16GBK详解

    此问题发生在数据库迁移过程中.源数据库:自己笔记本上win7 64位系统的oracle11g个人版,字符集ZHS16GBK :目标数据库,HP的sqlserver2008 系统 64位数据库服务器,字 ...

  4. 五.Jenkins安装plugin

    http://blog.csdn.net/jmyue/article/details/9376237

  5. PHP build notes - WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 3.0, min: 204, excluded: 3.0).

     WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 3.0, ...

  6. mui 下拉刷新

    mui 下拉刷新 此文提供的是mui这种下拉刷新.悬浮于页面上,比较好用. <!DOCTYPE html> <html> <head> <meta chars ...

  7. memcache占用CPU过高的解决办法

    Simon最近为公司服务器操碎了心 , 先是mysqld进程占用CPU过高 , 导致服务器性能变低 ,网站打开太慢.通过增加max_connections及table_cache解决了问题 ,随后发现 ...

  8. 10个常见的Node.js面试题

    如果你希望找一份有关Node.js的工作,但又不知道从哪里入手评测自己对Node.js的掌握程度. 本文就为你罗列了10个常见的Node.js面试题,分别考察了Node.js编程相关的几个主要方面. ...

  9. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(三)

    Spring+SpringMVC MVC呢,现在似乎越来越流行使用SpringMVC框架,我自己用的感觉,是非常好,确实很舒服,配置一开始是麻烦了一点点,但是后续的开发真的是很清爽! SpringMV ...

  10. js parsefloat

    项目中需要对返回的小数进行格式化,把零省略掉. 1.00   ---> 1 1.01   ---> 1.01 1.10   ---> 1.1 parseFloat() 函数可解析一个 ...