java反射删除类属性,java反射基本使用(得到类中属性、方法、构造方法)

整理了一下通过反射获取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的参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值