新手关于java的反射学习,遇到点儿问题,求达人解答
java新手,最近在看反射,程序遇到点儿问题,求达人解答下。
描述:
我写了个简单的类,想通过反射来打印出这个类的方法和字段;并且创建一个实例,修改这个实例的私有字段。
问题:
打印出来的方法 修饰符返回的都是public final类型,但我定义的明明是public,这中间的问题到底出在哪儿?
我查了方法返回的Modifier确实是public final的,不明所以。
忘了说,我的java是 jdk 1.8.0_101,Eclipse是Neon.1a Release (4.6.1)。
代码是这样的
MyReflectionTest.java文件
package sr;
//便于对照
public class MyReflectionTest{
private String name;
public MyReflectionTest(){
name="MyReflectionTest";
}
public MyReflectionTest(String name){
this.name=name;
}
public void setName(String newName){
this.name=newName;
}
public String getName(){
return name;
}
public String toString(){
return name;
}
}
Test.java文件
package sr;
import java.lang.reflect.*;
import java.lang.Class;
import sr.MyReflectionTest;
public class Test{
//用来测试反射
public static void main(String [] args){
reflectionPrintTest(); //打印整个类
reflectionFieldTest(); //修改私有字段
}
//用来测试字段的反射,此函数会打印出MyReflectionTest类的公共所有方法和字段(没有包括构造方法)
public static void reflectionPrintTest(){
//获取对象的三种方式
// Class<?> c=(new MyReflectionTest()).getClass(); //方式1
// Class<?> c=MyReflectionTest.class; //方式2
try{
Class<?> c=Class.forName("sr.MyReflectionTest");//方式3
//打印类属性
StringBuffer sb=new StringBuffer();
sb.append(Modifier.toString(c.getModifiers()));
sb.append(" Class "+c.getSimpleName()+" {\n");
//打印所有字段属性
Field [] fds=c.getDeclaredFields();
for(Field tempFd:fds){
sb.append("\t"+Modifier.toString(tempFd.getModifiers())+" ");//获得属性的修饰符,例如public,static等等
sb.append(tempFd.getType().getSimpleName() + " ");//属性的类型的名字
sb.append(tempFd.getName()+";\n");//属性的名字+回车
}
//下面打印所有的方法
Method [] md=c.getMethods();
for(Method tempMd:md){
//打印返回修饰符
sb.append("\t"+Modifier.toString(tempMd.getClass().getModifiers()));
//打印返回类型
sb.append(" "+tempMd.getReturnType().getName()+" ");
//打印方法名
sb.append(" "+tempMd.getName());
//打印方法参数
sb.append("(");
for(Class<?> tempMdPara:tempMd.getParameterTypes()){
sb.append(" "+tempMdPara.getName());
}
sb.append(");\n");
}
sb.append("}");
System.out.println(sb);
}catch(Exception e){
e.printStackTrace();
}
}
//测试修改private字段
public static void reflectionFieldTest(){
MyReflectionTest reflOb=new MyReflectionTest("Hello");
System.out.println(reflOb);
Class<?> c=MyReflectionTest.class; //获取Class对象
Field [] fds=c.getDeclaredFields();
try{
for(Field fd:fds){
if(fd.getName().equals("name")){
fd.setAccessible(true);
fd.set(reflOb,"Bye");
fd.setAccessible(false);
}
}
}catch(Exception e){
e.printStackTrace();
}
System.out.println(reflOb);
}
}
我电脑跑出来的结果:
public Class MyReflectionTest {
private String name;
public final java.lang.String toString();
public final java.lang.String getName();
public final void setName( java.lang.String);
public final void wait();
public final void wait( long int);
public final void wait( long);
public final boolean equals( java.lang.Object);
public final int hashCode();
public final java.lang.Class getClass();
public final void notify();
public final void notifyAll();
}
Hello
Bye