博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射删除类属性,java反射基本使用(得到类中属性、方法、构造方法)
阅读量:7250 次
发布时间:2019-06-29

本文共 3122 字,大约阅读时间需要 10 分钟。

整理了一下通过反射获取java中的方法、成员变量、构造函数的方法:

假设我们有一个类为Student:

public class Student {

private int age;

private String name;

public String addr;

public Student(int age, String name, String addr) {

this.age = age;

this.name = name;

this.addr = addr;

}

public Student(int age, String name) {

this.age = age;

this.name = name;

}

private Student(int age) {

this.age = age;

}

public Student() {

}

private int method1(){

return 0;

}

private int method2(int age){

return age;

}

public void print(String name,int age){

System.out.println("hello:"+name+"年龄:"+age);

}

public String print2(String name,int age){

System.out.println("hello:"+name+"年龄:"+age);

return null;

}

@Override

public String toString() {

return "Student [age=" + age + ", name=" + name + ", addr=" + addr

+ "]";

}

}

1.获得Student中方法:

Student student = new Student();

Class studentClass = student.getClass();

// getDeclaredMethods得到本类中所有方法

Method[] studentMethods = studentClass.getMethods();

System.out.println("方法个数:"+studentMethods.length);

for (Method method : studentMethods) {

//得到返回类型

System.out.print("方法名称和参数:"+method.getName()+"(");

//取得某个方法对应的参数类型数组

Class[] paramsType = method.getParameterTypes();

for (Class paramType : paramsType) {

System.out.print(paramType.getTypeName()+" ");

}

System.out.print(")");

Class returnType = method.getReturnType();

System.out.println("返回类型:"+returnType.getTypeName());

}运行结果:

ef197b861ab8b14a85a90a12a41a995e.png

但是我们Student中不是还有method1和method2方法吗? 如果我们想要取到private修饰的方法 那我们可以使用getDeclaredMethods()来得到:

98d756cd05fda19f6242cd02fc89f5ba.png

2.通过名称和参数类型确定对应的方法并执行:

//通过方法名称和方法参数确定一个方法

//getMethod(“MethodName”,paramsTypes)得到的public的方法

Method method = studentClass.getMethod("print", String.class,int.class);

method.invoke(student,"张三", 23);

结果:

442e6a0381ae888406469cbb0de14c7d.png

这里值得注意的是:如果我们的变量studentClass是使用Student.class.getClass();直接得到的话,那会抛出java.lang.NoSuchMethodException: java.lang.Class.print(java.lang.String,

int)的错误,我们不能使用一个没有实例化的对象来寻找里面的方法。

3.得到构造方法:

Constructor[] cs2 = Student.class.getConstructors();

System.out.println("构造方法个数:"+cs2.length);

for (Constructor constructor : cs2) {

String printstr = "(";

//获取某个构造方法中的参数数组

Class[] paramsType = constructor.getParameterTypes();

for (Class parameter : paramsType) {

printstr = printstr+parameter.getTypeName()+",";

}

if(printstr.length()>2){

printstr = printstr.substring(0, printstr.length()-1);

}

System.out.println(printstr+")");

}

结果:

6b9e20c654ced714acd0fc1969c539ad.png

我们要得到private修饰的构造参数时使用:Student.class.getDeclaredConstructors();

c66d3df120160655b6e208d78873fb0a.png

4.通过构造方法实例化对象

//实例化构造方法实例化对象

Constructor constructor = Student.class.getConstructor(int.class,String.class);

Student student2 = constructor.newInstance(new Object[]{23,"李四"});

//Student student2 = constructor.newInstance(23,"李四");

//因为newInstance参数是... 所以上面方式传参也可以 传递的参数要和确定构造方法的参数类型一致

System.out.println(student2.toString());

结果:

5e042679d375b4a0b55797f24261d476.png

5.获取类中field信息:

//getFields()方法获取的是所有的public的信息

//getDeclaredFields()获取的是该类自己声明的成员变量信息

Class stuClass = Student.class;

Field[] fs = stuClass.getDeclaredFields();

for(Field field : fs){

//得到类的变量的类型的类类型

Class fieldType = field.getType();

String fieldTypeStr = fieldType.getName();

//得到成员变量的名称

String fieldname = field.getName();

System.out.println("类型:"+fieldTypeStr+"名称:"+fieldname);

}

结果:

642fedaffc18cd6e05dae09820af6862.png

如果我们使用的是getFields()那我们只能得到一个:类型:java.lang.String名称:addr的参数

转载地址:http://yiqbm.baihongyu.com/

你可能感兴趣的文章
Redisson官方文档 - 12. 独立节点模式
查看>>
AD域笔记
查看>>
HTTP协议详解
查看>>
apache实现多端囗多域名配置
查看>>
Linux命令(15):type命令
查看>>
第一单元作业
查看>>
Azure云端部署Exchange 2016双数据中心—Part6(DAG切换测试)
查看>>
通过ansible部署高可用LNAMMKP架构
查看>>
IBM Aix系统添加硬盘步骤
查看>>
“esxcli software vib” commands to patch an ESXi 5.x/6.x host (2008939)
查看>>
heartbeat管理与虚拟IP介绍
查看>>
Syslog-ng+Rsyslog收集日志:RELP可靠传输,替代UDP、TCP(五)
查看>>
课程第八天内容《基础交换八》补充案例
查看>>
ionic 之 基本布局
查看>>
nginx开启目录浏览
查看>>
32位Linux设置超大Oracle SGA的分析
查看>>
const 的用法总结
查看>>
2017企业网盘年终盘点|机遇与挑战并存,寡头显现
查看>>
将linux用在开发环境中
查看>>
在 Cent OS 6.5 中安装桌面环境
查看>>