java反射在小编眼里类似于一个远程操作器,在访问、检测、修改上更加便利而且是通过类似于不干涉所需操作对象进行相关操作。
反射功能在:java.lang.reflect 包中
java反射的实现首先是基于Class对象,在进行相应操作时首先根据所需操作类创建一个对象
Class 对象名=类对象名.getClass();
反射体现主要分为三个方法
1.访问构造方法(Constructor类相关方法实现)
2.访问成员变量(Field类相关方法实现)
3.访问方法(Method类相关方法实现)
便于理解以下是一个代码实例来介绍相应功能
首先我们编写一个普通类
public class Test1 {
int a;
public float b;
protected boolean c;
private String d; //此处为了便利操作各种对象都加上进行具体操作
public Test1(){
} //定义一个无参构造方法
public Test1(int a,float b){
this.a=a;
this.b=b;
}
public int setA() {
System.out.println("返回a的三次方");
return (a*a*a);
} //随意定义几个方法之后可能会用到验证
public float setB() {
System.out.println("返回a与b的乘积");
return ((float)a*b);
}
public boolean isC() {
System.out.println("如果a,b乘积不为0则输出true");
if (setB()!=0){
return true;
}
else {
return false;
}
}
public void getD() {
System.out.println("操作成功");
}
}
然后编写一个类实现反射对其进行相关操作
import java.lang.reflect.*;
public class Test2 {
public static void main(String[] args) {
Test1 test1=new Test1(5,2.12f); //先创建类对象
Class test=test1.getClass(); //创建Class对象实现对类的一些操作
Constructor[]a=test.getConstructors(); //以一个Constructor数组存储类对象的构造方法
System.out.println("该类中有"+a.length+"个构造方法"); //读取一下数组长度了解一下其中有多少个方法
for (int i = 0; i < a.length; i++) {
Constructor p=a[i]; //每次循环以一个Constructor对象获取Constructor数组a中元素然后以p进行操作
System.out.println("第"+(i+1)+"个构造方法中是否有可变数量参数");
System.out.println(p.isVarArgs());
Class b[]=p.getParameterTypes(); //以Class数组保存相应构造函数的参数类型
for (int j = 0; j < b.length; j++) {
System.out.println("第"+(i+1)+"个函数的第"+(j+1)+"参数类型为"+b[j]);
}
}
System.out.println("a的值为"+test1.a);
System.out.println("b的值为"+test1.b);
Field []element=test.getDeclaredFields(); //定义Field对象获取所有成员变量
for (int i = 0; i < element.length; i++) {
Field d=element[i]; //同上操作新建对象来获取数组对象进行操作,循环遍历每个成员变量
Class q=d.getType(); //定义一个q来保存获取的成员变量的类型以便做判断
System.out.println("第"+(i+1)+"个参数名为"+d.getName());
try{
if (q.equals(int.class)){
d.setInt(test1,9); 该方法实现对类对象里该类型成员变量值的修改
} //判断成员类型然后进行成员变量修改
else {
d.setFloat(test1,3.14f);
} //这边只对两个变量进行了判断修改同时还可以给为赋值对象赋值
}catch (Exception e){
}
}
System.out.println("通过远程修改后");
System.out.println("a的值为"+test1.a);
System.out.println("b的值为"+test1.b);
}
}
这边代码里省略了访问方法的一些具体做法因为在实现上与上述差不多所以这边直接做介绍
同样一般首先获取类中所有方法 Method[] 对象名=类对象名.getDeclaredMethods();
方法介绍:
getName(); //获取方法名
getParameterTypes(); //以Class数组获取方法参数类型
getReturnType(); //获取方法返回值类型
invoke(类对象名,方法参数); //该操作可以实现方法的运行