java之通过反射,来获得某对象的所有方法(类方法提取器)
参考Thinging in Java
在编程时, 如果不记得一个类是否有某个方法,或者不知道一个类究竟能做些什么,而又不想通过索引或 类的层次结构去查找jdk文档,这时通过反射的小工具能节省很多时间。
浏览实现了类定义的源代码或是其jdk文档,只能找到在 这个类定义中 被定义或被覆盖的方法。但,对你来说,可能有数十个更有用的方法都是继承自 基类的。要找出 这些方法,可能会很乏味而且费时间。幸运的是,反射机制 提供了一种方法,使我们能够编写可以自动展示接口的简单工具。
下面就是其工作方式:
package com.westward; import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.regex.Pattern; public class ShowMethods { private static String usage=
"usage:\n" +
"ShowMethods qualified.class.name\n"+
"To show all methods in class or:\n"+
"ShowMethods qualified.class.name word\n"+
"To search for methods involving 'word'";
private static Pattern p= Pattern.compile("\\w+\\.");
public static void main(String[] args) {
if (args.length<1) {
System.out.println(usage);
System.exit(0);
}
int lines= 0;
try {
Class<?> c= Class.forName(args[0]);
Method[] methods= c.getMethods();
Constructor[] ctors= c.getConstructors();
if (args.length==1) {
for (Method method : methods) {
System.out.println(p.matcher(method.toString()).replaceAll(""));
System.out.println(method);
}
for (Constructor ctor : ctors) {
System.out.println(p.matcher(ctor.toString()).replaceAll(""));
System.out.println(ctor);
}
lines= methods.length+ ctors.length;
}else {
for (Method method : methods) {
if (method.toString().indexOf(args[1]) != -1) {
System.out.println(p.matcher(method.toString()).replaceAll(""));
System.out.println(method);
lines++;
}
}
for (Constructor ctor : ctors) {
if (ctor.toString().indexOf(args[1]) != -1) {
System.out.println(p.matcher(ctor.toString()).replaceAll(""));
System.out.println(ctor);
lines++;
}
}
}
} catch (ClassNotFoundException e) {
System.out.println("No such class: " + e);
}
} }
input:com.westward.ShowMethods
output:
public static void main(String[])
public static void com.westward.ShowMethods.main(java.lang.String[])
public final void wait(long,int) throws InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void wait(long) throws InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void wait() throws InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean equals(Object)
public boolean java.lang.Object.equals(java.lang.Object)
public String toString()
public java.lang.String java.lang.Object.toString()
public native int hashCode()
public native int java.lang.Object.hashCode()
public final native Class getClass()
public final native java.lang.Class java.lang.Object.getClass()
public final native void notify()
public final native void java.lang.Object.notify()
public final native void notifyAll()
public final native void java.lang.Object.notifyAll()
public ShowMethods()
public com.westward.ShowMethods()
java之通过反射,来获得某对象的所有方法(类方法提取器)的更多相关文章
- DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类 /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...
- 0034 Java学习笔记-反射-初步2-操作对象
通过反射创建对象 通过反射创建对象有两种方式,一种通过Class对象的newInstance()方法,一种是获取到Class对象的Constructor后,再调用newInstance()方法,前者要 ...
- 【Java】利用反射执行Spring容器Bean指定的方法,支持多种参数自动调用
目录 使用情景 目的 实现方式 前提: 思路 核心类 测试方法 源码分享 使用情景 将定时任务录入数据库(这样做的好处是定时任务可视化,也可以动态修改各个任务的执行时间),通过反射执行对应的方法: 配 ...
- Effective java笔记(二),所有对象的通用方法
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...
- 反射之三种class对象的获取方法
package www.bit.tech; public class Fanshe1 { } package www.bit.tech; import www.bit.tech.Fanshe1; cl ...
- 【Java基础】Java中的反射机制
一.反射的理解 (1)正射 在理解反射这个概念之前,我们先来理解Java中的“正射”. 我们在编写代码时,当需要使用到某一个类的时候,必定先会去了解这是一个什么类,是用来做什么的,有怎么样的功能. 之 ...
- java 27 - 2 反射之 反射的概述以及获取Class文件对象的方式
反射: JAVA语言的反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调 ...
- JAVA基础知识之JVM-——使用反射生成并操作对象
Class对象可以获取类里的方法,由Method对象表示,调用Method的invoke可以执行对应的方法:可以获取构造器,由Constructor对象表示,调用Constructor对象的newIn ...
- Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)
反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...
随机推荐
- 如何读懂 STATSPACK 报告 (转) & Toad 结合
可与 toad 相结合的内容, 用 这种颜色可以利用 toad(database->monitor->server statistics)查看到下边的很多信息, 比如 wait event ...
- HTML <meta> 标签
<meta> 元素可提供有关页面的元信息,元数据总是以名称/值的形式被成对传递的. <meta> 标签位于文档的头部,不包含任何内容. <meta> 标签的属性定义 ...
- ElasticSearch(ES)和solr的关系和区别
可以参考这篇文章:http://www.cnblogs.com/chowmin/articles/4629220.html Solr 2004年诞生(当时是Solar). ElasticSearch ...
- Java集合类源码分析
常用类及源码分析 集合类 原理分析 Collection List Vector 扩充容量的方法 ensureCapacityHelper很多方法都加入了synchronized同步语句,来保 ...
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
Android 高手进阶(21) 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处http://blog.csdn.net/xiaanming/article/details ...
- 【Linux系统】防暴力破解
在日志文件/var/log/secure 中可以看到涉及到安全方面的日志,可以查看是否有人尝试暴力破解及是否成功,对于肉鸡行为有一定帮助 思路基本上都是加强密码的复杂度,增加iptables配置黑名单 ...
- 闲谈--心态 (zhuan)
http://blog.csdn.net/marksinoberg/article/details/53261034 ***************************************** ...
- Js_动画显示背景图片
jAni是一个可以动画显示背景图片的jQuery插件.这个插件基本上是GIF动画的一个替代品,但是他有他的好处.所有浏览器都支持GIF形式的动画格式,而且也不需要额外的javaScript代码和标记. ...
- mysql spider之拆库无忧
数据库的三板斧 先上MySQL,之后再上读写分离,然后呢? 后面典型的做法是垂直拆库和水平分表. 一旦数据库拆了之后,代价就来了. 1.事务不能跨库了(少,但是很重要,可以适当改写) 2.相关的关联查 ...
- 绑定事件 addEventListener
addEventListener() 方法用于向指定元素添加事件句柄. addEventListener() 方法添加的事件句柄不会覆盖已存在的事件句柄. 你可以向一个元素添加多个事件句柄. 你可以向 ...