再回首,Java温故知新(十一):Java反射

时间:2022-10-26 18:25:24

  最近继续回顾Java基础,进行到了Java反射这一部分,个人感觉这部分应该算是Java的高级特性了,在日常开发中使用的并不多,应用人员主要是工具构建人员,所以这次学习中以了解为主,Java反射主要应用在工具型项目的开发中,例如Spring。

  在程序运行期间,JRE会为所有的对象创建一个类型标识,保存这些信息的类就是Class类,反射所有的功能都是围绕这个类来实现的,获取方法有以下几种:

    1.new Date().getClass();

    2.Date.class;

    3.Class.forName(java.util.Date)

  基础方法如下(更多方法请查看API):

    1.Class.getName()    返回类名

    2.Class.newInstance()  根据Class对象创建实例

    3.Class.getDeclaredFields()    获取类的属性数组

    4.Class.getDeclaredMethods()   获取类的方法数组

    5.Class.getDeclaredConstructors()  获取类的构造器数组

    6.Field/Method/Constructor.getModifiers()  获取属性/方法/构造器的修饰符

  下面附上一个解析类的DEMO,运行结果如下:

    再回首,Java温故知新(十一):Java反射

  代码如下:

  

package com.demo.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner; /**
* Java反射获取类内容
* @author liweitao
*
*/
public class PrintClass { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);
System.out.println("enter a class name");
String name = scanner.nextLine(); try {
Class cls = Class.forName(name);
String modifier = Modifier.toString(cls.getModifiers());
Class superCls = cls.getSuperclass();
Class[] interCls = cls.getInterfaces(); System.out.print(modifier +" class " + name); if(superCls != null && superCls != Object.class){
System.out.print(" extends " + superCls.getName());
} for(int i = 0; i < interCls.length; i++){
if(i == 0){
System.out.print(" implements ");
}else if(i > 0){
System.out.print(",");
}
System.out.print(interCls[i].getName());
}
System.out.println("{");
printFields(cls);
printConstructors(cls);
printMethods(cls);
System.out.print("}");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} } /**
* 打印字段
* @param cls
*/
public static void printFields(Class cls){
Field[] fields = cls.getDeclaredFields();
for(Field field : fields){
StringBuffer result = new StringBuffer();
Class type = field.getType();
String name = field.getName();
String modifiers = Modifier.toString(field.getModifiers());
if(modifiers.length() > 0){
result.append("\t").append(modifiers).append(" ")
.append(type.getName()).append(" ").append(name);
}
System.out.println(result.toString());
}
} /**
* 打印构造器
* @param cls
*/
public static void printConstructors(Class cls){
Constructor[] constructors = cls.getDeclaredConstructors();
for(Constructor constructor : constructors){
StringBuffer result = new StringBuffer();
String name = constructor.getName();
String modifiers = Modifier.toString(constructor.getModifiers());
if(modifiers.length() > 0){
result.append("\t").append(modifiers).append(" ").append(name).append("(");
} Class[] params = constructor.getParameterTypes();
for(int j = 0; j < params.length; j++){
if(j > 0){
result.append(",");
}
result.append(params[j].getName());
}
result.append(")");
System.out.println(result.toString());
}
} public static void printMethods(Class cls){
Method[] methods = cls.getDeclaredMethods();
for(Method method : methods){
StringBuffer result = new StringBuffer();
String name = method.getName();
Class returnType = method.getReturnType();
String modifier = Modifier.toString(method.getModifiers());
Class[] params = method.getParameterTypes(); if(modifier.length() > 0){
result.append("\t").append(modifier).append(" ")
.append(returnType.getName()).append(" ").append(name).append("(");
} for(int j = 0; j < params.length; j++){
if(j > 0){
result.append(",");
}
result.append(params[j].getName());
}
result.append(")");
System.out.println(result.toString());
}
} }

再回首,Java温故知新(十一):Java反射的更多相关文章

  1. 再回首,Java温故知新——开篇说明

    不知不觉在IT界从业2年了,两年时间足够一个人成长很多,当然也会改变很多事.在这两年时间里,随着对技术的深入了解,知识面的拓展以及工作难度的增大,渐渐的感觉自己技术方面根基不稳,多数问题也只是做到知其 ...

  2. 再回首,Java温故知新(一):Java概述

    Java发展历程 Java的发展要追溯到1991年,Patrick Naughton(帕特里克·诺顿)和James Gosling(詹姆斯·高斯林)带领Sun公司的工程师打算为有线电视转换盒之类的消费 ...

  3. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  4. java基础&lpar;十一 &rpar;-----反射——Java高级开发必须懂的

    本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...

  5. 回首Java——再回首JDK

    如果你是刚要被Java军训的新兵,可有几时对环境搭建而不知所措?又如若你是驰骋Java战场多年的老将,可曾拿起陪伴你许久的82年的JDK回味一番?今天我们就来道一道JDK,重新来认识认识这个既熟悉又陌 ...

  6. Java进阶之reflection&lpar;反射机制&rpar;——反射概念与基础

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  7. java学习:用反射构造bean

    先贴一些反射的基本知识:-------------------------------------------------------------------- 一.什么是反射:反射的概念是由Smit ...

  8. 反射那些事儿——Java动态装载和反射技术

    一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...

  9. java工厂类与反射机制

    java 简单工厂类 2012-04-22 15:44:07|  分类: java |  标签:java工厂类  简单工厂类  |举报|字号 订阅     简单工厂模式需要由以下角色组成: 接口    ...

随机推荐

  1. visual studio2015使用git管理源代码

    1.注册https://git.oschina.net/ 2.注册好后,创建一个测试项目,如下图: 点击创建,如下: 上面的红框中的地址下面会用到. 3.git初始化设置 在本地电脑要安装git,打开 ...

  2. HoverTree开发日志之验证码

    HoverTree是一个ASP.NET的开源CMS,目前包含文章系统,图库和留言板功能.代码完全开放,文章内容页生成了静态的HTM页面,留言板提供留言审核功能,文章可以发布HTML源代码,图片上传同时 ...

  3. Java开源数据库管理工具

    SQuirreL SQL Client   SQuirreL SQL Client 是一个用 Java 编写的程序,它允许您查看数据库的内容.发出 SQL 命令,以及如您将看到的,执行许多其他功能.构 ...

  4. BAT染指影视制作 欲全面撬开互联网粉丝经济

    预測: 或靠"用户"模式盈利 除了内容制作,电影发行也在遭遇互联网模式的冲击. 除了给片方支付高额保底以外,随着市场竞争激烈.新进入者都在争夺好片的发行权. 业内预測.再往后,发行 ...

  5. Android各代码层获取系统时间的方法

    1. 在java层,long now = SystemClock.uptimeMillis(); 2. 在native层,nsecs_t now = systemTime(SYSTEM_TIME_MO ...

  6. 『片段』ShellHelper 控制台程序 的 程序调用(支持输入命令得到返回字符串输出)

    背景: > 之前做 OGG 时,被 OGG的配置 恶心到了.(OGG是啥,这里就不解释了) > 总之就是一个 控制台程序,总是得手动执行一堆命令,每次都得输入 —— 实在是打字打累了. & ...

  7. div在另一个div居中对齐

    position:fixed; top:0; right:0; left:0; bottom:0; margin:auto;

  8. Int和String互转的方法

    Java 中int.String的类型转换   int -> String int i=12345;String s="";第一种方法:s=i+"";第二 ...

  9. php面试题整理(四)

    应该是group by username }

  10. &lbrack;模板&rsqb;ETT

    解:splay维护括号序列,就是进子树一次出子树一次.树上每个点直接记录这两个点的编号. 建树的时候按照分配的编号建树. #include <bits/stdc++.h> typedef ...