新手关于java的反射学习,遇到点儿问题,求达人解答

Gsredsky 2016-12-03 12:16:48
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
...全文
215 2 打赏 收藏 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
解开者 2016-12-05
  • 打赏
  • 举报
回复
引用 1 楼 windowsoahil 的回复:
private或static修饰的方法默认带有final
抱歉……看错了 是因为取错了,取成了类的修饰符
//打印返回修饰符
sb.append("\t"+Modifier.toString(tempMd.getModifiers()));
解开者 2016-12-05
  • 打赏
  • 举报
回复
private或static修饰的方法默认带有final
内容概要:本文围绕通过短时倒谱(Cepstrogram)计算进行时-倒频分析的研究,提出了一种基于Matlab的信号处理方法,旨在从复杂信号中提取时变的倒频域特征,尤其适用于具有非线性反馈的LTI系统识别。文中系统阐述了短时倒谱的理论基础、计算流程与实现机制,并结合Simulink与Matlab代码实现了多个典型应用案例,涵盖非线性系统辨识、路径损耗建模、信号去噪与增强等,充分展示了该方法在系统建模与信号分析中的强大能力。研究不仅提供了完整的算法实现方案,还深入探讨了其在科研与工程实践中的广泛应用前景。; 适合人群:具备扎实的信号处理理论基础与Matlab编程能力,从事自动化、通信工程、电子工程、控制科学等领域的高校研究生、科研人员及工程技术人员。; 使用场景及目标:①实现对具有非线性反馈的LTI系统的精确建模与参数辨识,提升系统识别的准确性与鲁棒性;②在强噪声背景下进行有效的信号特征提取与时-倒频域分析,恢复信号的有效成分;③作为高级信号处理的教学与科研平台,帮助深入理解倒谱分析的物理意义及其在现代工程中的实际应用。; 阅读建议:建议读者在学习过程中紧密结合文中提供的Matlab代码与Simulink模型进行动手实践,通过调整参数、修改输入信号等方式观察分析结果的变化,以加深对算法机理的理解;同时可访问作者提供的网盘资源与完整代码包,系统性地掌握相关技术的优化与拓展方法。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧