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项目的朋友遇到问题也都会联系我去解决 ...
随机推荐
- R语言生成随机数
1.概述 作为一种语言进行统计分析,R有一个随机数生成各种统计分布功能的综合性图书馆.R语言可以针对不同的分布,生成该分布下的随机数.其中,有许多常用的个分布可以直接调用.本文简单介绍生成常用分布随机 ...
- (原)centos7安装和使用greenplum4.3.12(详细版)
对于很多IT人来说GREENPLUM是个陌生的名字.简单的说它就是一个与ORACLE, DB2一样面向对象的关系型数据库.我们通过标准的SQL可以对GP中的数据进行访问存取. 本质上讲GREENPL ...
- KMP算法【代码】
废话不多说,看毛片算法的核心在于next数组. 很多地方用的都是严书上的方法来求解next数组,代码确实简洁明了,但是可能对于初学者来说不容易想到,甚至不是一下子能理解.(好了,其实我说的就是自己,别 ...
- [编织消息框架][JAVA核心技术]动态代理应用8-IRpcReceive实现
private static Map<Short, Map<Byte, Method>> RECEIVE_METHOD_INFO = new HashMap<>() ...
- Java 基础知识总结
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.数据类型: 数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte 8位 (by ...
- text-decoration:underline与字体重叠
前几天工作遇到了字体与underline下划线重叠的问题,折腾了半天.今天在张鑫旭的博客上找到了几种解决方法分享一下 1 text-decoration-skip:不推荐使用 17年了这个属性支持率依 ...
- [原]使用MessageAnalyzer实时查看远端日志
1. 下载安装Message Analyzer 从Message Analyzer下载链接下载,安装过程从略. 说明:关于Message Analyzer的视频教程,可以在打开后的主界面上看到. 2. ...
- node服务成长之路
我们的系统也从第一代平台开始到现在第四代平台更换中,对这四代平台做一个简单的介绍: 第一代平台,主要是集中式,以快速上线为目的:第二代平台主要是分布式改造,缓解各服务压力:第三代平台主要做服务端SOA ...
- BeautifulSoup库children(),descendants()方法的使用
BeautifulSoup库children(),descendants()方法的使用 示例网站:http://www.pythonscraping.com/pages/page3.html 网站内容 ...
- css3 兼容各个浏览器
transform:rotate(9deg);-ms-transform:rotate(9deg); /* Internet Explorer */-moz-transform:rotate(9deg ...