Java Reflect

综述

方法的反射

成员变量的反射

构造函数的反射

类加载机制

在面向对象的世界里,万事万物皆对象。

但在Java里面有两样东西不是对象:静态的成员、普通数据类型类(但它们有封装类弥补)

类是对象,类是 java.lang.Class 的实例对象(There is a class named Class)

package com.gcusky.reflect; class ClassDemo{ Foo foo = new Foo(); // Foo的实例对象 /** * foo 是 Foo 类的实例对象 * Foo 是 Class 类的实例对象,又叫类类型(class type) */ // 表示1 -> 任何一个类都有一个隐含的静态成员变量class Class c1 = Foo.class; // 表示2 -> 已知该类对象可用getClass方法获取类类型 Class c2 = foo.getClass(); // 表示3 -> 用类的全称获取 try { Class c3 = Class.forName("com.gcusky.reflect.Foo"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 可以通过类的类类型创建该类的实例对象 try { Foo foo1 = (Foo)c1.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } class Foo

Java 动态加载类

Class.forName("类的全称")

不仅表示了类的类类型,还代表了动态加载类

编译时刻加载类是静态加载类

运行时刻加载类是动态加载类

class Office{ public static void main(String[] args){ // new 创建对象,是静态加载类,在编译时就需要加载所有可能使用到的类 if("Word".equals(args[0])) { Word w = new Word(); w.start(); } // Class.forName 创建对象,是动态加载类,在运行时才加载 try { Class c = Class.forName(args[0]) Word w = (Word) c.newInstance(); // 通过类类型,创建该对象 w.start(); } catch (Exception e) { e.printStackTrace(); } } }

Java 获取方法信息

基本的数据类型,

java.lang.reflect.Method 封装了关于方法的操作

button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text="package com.gcusky.reflect; import java.lang.reflect.Method; public class Demo { /** * 打印类的信息,包括类的成员函数、成员变量 * @param obj 对象 */ public static void printClassMessage(Object obj) { // 要获取类的信息,首先要获取类的类类型 Class c = obj.getClass(); // 获取类的全名 String fullName = c.getName(); /** * Method类:方法对象 * 一个成员方法就是一个Method对象 * getMethods()方法获取的是所有的public的函数,包括父类继承而来的 * getDeclaredMethods() 获取的是所有该类自己声明的方法,不问访问权限 */ Method[] ms = c.getMethods(); // c.getDeclaredMethods(); for (int i = 0; i < ms.length; i++) { // 得到方法的返回类型 Class returnType = ms[i].getReturnType(); // 得到方法的名称 String name = ms[i].getName(); // 获取参数类型 Class[] paramTypes = ms[i].getParameterTypes(); } } }" title="" data-original-title="复制">

package com.gcusky.reflect; import java.lang.reflect.Method; public class Demo{ /** * 打印类的信息,包括类的成员函数、成员变量 * @param obj 对象 */ public static void printClassMessage(Object obj){ // 要获取类的信息,首先要获取类的类类型 Class c = obj.getClass(); // 获取类的全名 String fullName = c.getName(); /** * Method类:方法对象 * 一个成员方法就是一个Method对象 * getMethods()方法获取的是所有的public的函数,包括父类继承而来的 * getDeclaredMethods() 获取的是所有该类自己声明的方法,不问访问权限 */ Method[] ms = c.getMethods(); // c.getDeclaredMethods(); for (int i = 0; i < ms.length; i++) { // 得到方法的返回类型 Class returnType = ms[i].getReturnType(); // 得到方法的名称 String name = ms[i].getName(); // 获取参数类型 Class[] paramTypes = ms[i].getParameterTypes(); } } }

Java 获取成员变量信息

成员变量也是对象

java.lang.reflect.Field 封装了关于成员变量的操作

button" class="copyCode code-tool" data-toggle="tooltip" data-placement="top" data-clipboard-text=" /** * 成员变量也是对象,Field封装了关于成员变量的操作 * getFields()获取的是所有的public的成员变量 * getDeclaredMethods()获取的是所有该类自己声明的成员变量 */ Field[] fs = c.getDeclaredFields(); // c.getFields(); for (int i = 0; i < fs.length; i++) { // 得到成员变量的类型 Class fieldType = fs[i].getType(); String typeName = fieldType.getName(); // 得到成员变量的名称 String fieldName = fs[i].getName(); }" title="" data-original-title="复制">

/** * 成员变量也是对象,Field封装了关于成员变量的操作 * getFields()获取的是所有的public的成员变量 * getDeclaredMethods()获取的是所有该类自己声明的成员变量 */ Field[] fs = c.getDeclaredFields(); // c.getFields(); for (int i = 0; i < fs.length; i++) { // 得到成员变量的类型 Class fieldType = fs[i].getType(); String typeName = fieldType.getName(); // 得到成员变量的名称 String fieldName = fs[i].getName(); }

Java 获取构造函数信息

/** * 构造函数也是对象 * java.lang.Constructor中封装了构造函数的信息 */ Constructor[] cs = c.getDeclaredConstructors(); for (Constructor constructor : cs) { constructor.getName(); Class[] paramType = constructor.getParameterTypes(); }

Java 方法的反射

如何获取某个方法:方法的名称和方法的参数列表才能唯一决定某个方法

方法反射的操作:method.invoke(对象, 参数列表)

class A{ public void print(int a, int b){ System.out.println(a + b); } } A a = new A(); Class c = a.getClass(); try { // Method m = c.getMethod("print", new Class[]{int.class, int.class}); Method m = c.getMethod("print", int.class, int.class); // Object o = m.invoke(a, new Object[]{10, 20}); Object o = m.invoke(a, 10, 20); } catch (Exception e) { e.printStackTrace(); }

Java 类加载机制

ArrayList list = new ArrayList(); ArrayListlist1 = new ArrayList(); list == list1; // true list1.add(20); // error - 编译检测出错" title="" data-original-title="复制">

ArrayList list = new ArrayList(); ArrayList list1 = new ArrayList(); list == list1; // true list1.add(20); // error - 编译检测出错

反射都是编译之后的操作,因此可看出泛型在编译之后会被擦除

Java 中集合的泛型用于防止错误输入,只在编译阶段有效,绕过编译则无效

Class c = list1.getclass(); try { Method m = c.getMethod("add", Object.class); m.invoke(list1, 20); // correct - 绕过编译操作就绕过了泛型 } catch (Exception e) { e.printStackTrace(); }

java反射泛型类型,【Java反射】Java 泛型基础相关推荐

  1. Java面向对象系列[v1.0.0][泛型基础]

    Java5增加泛型支持,很大程度上是为了让集合记住其元素的数据类型,在此之前不用泛型的话,一旦把一个对象放进Java集合中,集合就会忘记对象的类型,把所有的对象当成Object类型处理,从集合里取出对 ...

  2. java反射机制深入详解_Java基础与提高干货系列——Java反射机制

    前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制 ...

  3. Java高新技术笔记:反射、多线程、泛型、枚举、javaBean、代理

    1.IDE: Integrated Development Environment 2.集成开发环境两个主流:Eclipse和netBeans 3.preference: 偏爱 4.Compiler: ...

  4. java 反射练习_JAVA反射的基础学习

    反射 :reflection 程序的一种内省机制 程序可以在运行期间动态的创建对象,获取对象类型,调用对象行为 内省机制在java和.net语言中有,在早期的C,C++,delphi,vb这些语言都没 ...

  5. java反射头文件_编程基础知识——C++能不能支持Java和ObjC的反射?

    C++能不能支持Java和ObjC的反射? 要回答这个问题.首先我们要清楚什么是反射.什么是反射? 教科书的解释我就不说了,(^o^)事实上我也记不得.实际开发应用的反射就是在没有某个类型的头文件或者 ...

  6. 一个小栗子聊聊JAVA泛型基础

    背景 周五本该是愉快的,可是今天花了一个早上查问题,为什么要花一个早上?我把原因总结为两点: 日志信息严重丢失,茫茫代码毫无头绪. 对泛型的认识不够,导致代码出现了BUG. 第一个原因可以通过以后编码 ...

  7. 如何优化java反射,如何有效地使用Java反射

    反射是一种内置机制,用于在执行时对Java程序进行内省.它可以用来检查.修改和转换Java程序,而不会影响现有代码.这个强大的特性可以用来扩展程序的功能,在运行时检查类或对象的内部结构.本文试图探究其 ...

  8. java Class类与反射

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反 ...

  9. java反射设置access_Java反射之java.lang.reflect.Field

    前面一章 讲了怎么通过Class获取到成员(成员变量.成员方法.构造器),本篇文章开始详细讲解成员变量(java.lang.reflect.Field)的详细用法. 获取field的类型 有两种方式可 ...

最新文章

  1. usaco Feed Ratios
  2. centos8开启网络
  3. DBUtils (30)
  4. Strom+Kafka + redis实时计算单词出现频率的案例
  5. nginx可以负载均衡多个tomcat,nginx主机挂了怎么办?Keepalived
  6. TCP/IP协议的TCP握手协议
  7. C语言试题五十五之m个人的成绩存放在score数组中,请编写函数function,它的功能是:将高于平均分的人数作为函数值返回,将高于平均分的分数放在high所指定的数组中。
  8. 阿里大数据云原生化实践,EMR Spark on ACK 产品介绍
  9. bigdicmal除法精度设置_BigDecimal 高精度计算 熟悉扩展,java除法保留小数问题
  10. IPD+CMMI企业产品开发系统性解决方案
  11. 堆(基本介绍,代码实现,以及例题)
  12. Tableau Desktop【包含各个版本】
  13. Nanopore sequencing and assembly of a human genome with ultra-long reads
  14. 【触想智能】工业平板电脑触摸屏选择分析
  15. 什么是哥德尔不完备定理?
  16. 机器学习科研助手总结
  17. SSH Tunnel 使用
  18. 论文投稿指南——中文核心期刊推荐(电工技术)
  19. 嵌入式系统与通用计算机系统的区别,嵌入式操作系统和通用计算机系统的区别是什么...
  20. db2嵌套查询效率_提高DB2 查询性能的常用方法

热门文章

  1. wifi无线网卡移植到andorid
  2. 【DIY】200521近期在做的项目小结,DIY进展汇报
  3. openssl 证书管理
  4. 各版本arm-gcc区别与安装
  5. Python 基本数据类型、运算符
  6. 一次“失败”的阿里面试之旅
  7. Swift 3.1新改动
  8. saltstack实战-6
  9. MySQL字符串截取函数
  10. 调整weblogic内存的分配和使用