java反射 顺序输出类中的方法
java反射可以获取一个类中的所有方法,但是这些方法的输出顺序,并非代码的编写顺序。
我们可以通过自定义一个注解来实现顺序输出类中的方法。
首先,先写一个类,定义增删改查4个方法
public class TestMethod {
public void add(Object obj) {
}
public void delete(String a) {
}
public void update(int b) {
}
public void find() {
}
}
然后写一个测试类看一下输出顺序:
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> clazz = Class.forName("test.TestMethod");
Method[] methods = clazz.getMethods();
for (Method m : methods ) {
System.out.println(m.getName());
}
}
}
输出结果如下:
add
update
find
delete
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
可以看到,输出顺序并非代码的书写顺序,并且还将继承自Object的方法也打了出来
接下来做这么几件事情:
1 写个数组存储继承自Object的所有方法,用来过滤
2 自定义注解,用来给方法定义一个顺序
3 写注解的解析器,用来返回这个顺序值
4 用Collections写一个比较器,用来给方法排序
最后遍历输出
String[] removeMethods = new String[] { "wait", "equals", "toString", "hashCode", "getClass",
"notify", "notifyAll" };
import static java.lang.annotation.ElementType.METHOD; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation { int value() default 0; }
import java.lang.reflect.Method;
public class MyAnnotationProcessor {
public int getSequence(Method method) {
if (method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation myAnnotation = (MyAnnotation) method.getAnnotation(MyAnnotation.class);
return myAnnotation.value();
}
return 0;
}
}
public class TestMethod {
@MyAnnotation(1)
public void add(Object obj) {
}
@MyAnnotation(2)
public void delete(String a) {
}
@MyAnnotation(3)
public void update(int b) {
}
@MyAnnotation(4)
public void find() {
}
}
public class Main {
static String[] removeMethods = new String[] { "wait", "equals", "toString", "hashCode", "getClass",
"notify", "notifyAll" };
public static void main(String[] args) throws ClassNotFoundException {
Class<?> clazz = Class.forName("test.TestMethod");
Method[] methods = clazz.getMethods();
List<String> removeList = new ArrayList<>(Arrays.asList(removeMethods)); // 用来存放需要过滤的方法
List<Method> methodList = new ArrayList<>(Arrays.asList(methods)); // 用来存放所有的方法
MyAnnotationProcessor processor = new MyAnnotationProcessor();
Collections.sort(methodList, (m1, m2) -> { // 这个比较的语法依赖于java 1.8
return processor.getSequence(m1) - processor.getSequence(m2);
});
for (Method m : methodList) { // 遍历排序后的方法列表
if (removeList.contains(m.getName())) {
continue;
}
System.out.println(m.getName());
}
}
}
最后看一下输出结果:
add
delete
update
find
java反射 顺序输出类中的方法的更多相关文章
- Java反射机制demo(五)—获得并调用一个类中的方法
Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...
- java 27 - 6 反射之 通过配置文件运行类中的方法
在以前,如果我们想要调用一个类中的方法,只能这样子: 例: 有Cat和Dog两个类,里面有eat和run两个成员方法: public class Dog { public void eat() { S ...
- 第6章 Java类中的方法
1.如何定义java的方法 什么是方法:方法使用来解决一类问题的代码集合,是一个功能模块在类中定义个方法的方法是: 访问修饰符 返回值类型 方法名(参数列表){ 方法体 } 1.访问修饰符,是限制该方 ...
- Android反射出一个类中的其他类对象并调用其对应方法
MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...
- 【转】python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>
[转]python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法> MRO了解: 对于支持继承的编程语言来说,其方法(属性)可能定义 ...
- Java Object类中toString方法的重写
Object类中的tostring方法的: 当我们输出一个对象时,实际是输出的是这个类中的tostring方法,是一个地址值,而不是类中的属性. 1 一:子类没有重写Object类中的toStrinn ...
- Java基础知识强化之集合框架笔记33:Arrays工具类中asList()方法的使用
1. Arrays工具类中asList()方法的使用 public static <T> List<T> asList(T... a): 把数组转成集合 注意事项: 虽然可以把 ...
- jsp中怎么调用java类中的方法
在jsp页面中先要,引入java类 例如: <%@page import="javabean.DbConn"%><!-- 引入包中的"类" - ...
- thymeleaf模板引擎调用java类中的方法(附源码)
前言 <Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦> 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决 ...
随机推荐
- *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ViewController > setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ViewController > ...
- JavaWeb之HTTP协议
一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. ...
- php调试之路
解析php中die(),exit(),return的区别 die()停止程序运行,输出内容exit是停止程序运行,不输出内容return是返回值die是遇到错误才停止exit是直接停止,并且不运行后续 ...
- 面试题(一)—Java基础(上)
1.面向对象的三大特征 (1)封装 封装性指的是隐藏了对象的属性和实现细节,对外仅提供公共的访问方式. 好处: 将变化隔离,提供复用性和安全性. (2)继承 提高代码的复 ...
- Linux命令之_Cut(转)
linux之cut用法 cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut [-bn ...
- 跟着刚哥梳理java知识点——集合(十二)
Java集合分为Collection和Map两种体系 一.Collection接口: Collections接口为我们提供了以下方法: size():返回集合中元素的个数 add(Object obj ...
- 前端必备PS技巧
hai,how is it going?I'm MuQing.I come back.哈哈,最近在英语的路上奋战,小秀一下.又好久没写博客了,实习的生活渐行渐远了,回到学校也终于能够坐下来对很多东西进 ...
- iptables常用命令之配置生产环境iptables及优化
第一步:清空当前的所有规则和计数 iptables -F #清空所有的防火墙规则 iptables -X #删除用户自定义的空链 iptables -Z #清空计数 第二步:配置允许ssh端口连接 i ...
- iOS数据本地化
本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...
- 除去ubuntu的grub引导
除去ubuntu的grub引导 step如下>> 进入ubuntu终端 sudo gedit /etc/defauli/grub 将 #GRUB_HIDDEN_TIMEOUT=0 最前面的 ...