public Field[] getDeclaredFields() throws SecurityException返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。public Method[] getDeclaredMethods() throws SecurityException返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
自己整个像java编译器的语法分析器的程序就行了
Method[] m=null; Field[] f = null; try{ Class nowClass=Class.forName(classFilename); m=nowClass.getDeclaredMethods(); f=nowClass.getDeclaredFields();
如果你有.java的文件,直接看就行了么。
如果将.class文件转成.java文件的话,找个反编译的工具。
打开看不就知道有多少方法,多少属性了吗?
throws SecurityException返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。public Method[] getDeclaredMethods()
throws SecurityException返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method[] m=null;
Field[] f = null;
try{
Class nowClass=Class.forName(classFilename);
m=nowClass.getDeclaredMethods();
f=nowClass.getDeclaredFields();
} catch (Throwable e) {
System.err.println(e);
}
完后再遍历数组
可以在dos下进入文件所在目录再输入 “javap -private 文件名”命令就可以看到了
正解
第一次听说,直接javac不就有了,关反射什么事,
如果就是想得到方法属性,跟反射也没关系
import java.lang.reflect.Method;
public class Name {
public static void main(String[] args) {
Method[] methods = null;
Field[] fields = null;
try {
Class classType = Class.forName("这里写你的类的名字");
methods = classType.getDeclaredMethods();
for(int i = 0; i < methods.length; i++) {
//获取方法的全部信息,例如:public void Print.print()
String methodStr = methods[i].toString();
//截取方法的名字,例如:print
System.out.println(methodStr.substring(methodStr.indexOf(".") + 1, methodStr.indexOf("(")));
}
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
}
}
com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
String[] cpargs = new String[] {"-d", "." ,"Temp.java"};
//动态编译
int status = javac.compile(cpargs);
if(status != 0 )
{
System.out.println("您给的Java代码有错!");
return null;
}
//创建一个URL数组
URL[] urls = {new URL("file:Temp.class")};
//以默认的ClassLoader作为父ClassLoader,创建URLClassLoader
URLClassLoader myClassLoader = new URLClassLoader(urls);
//加载Temp类(如果要加载内存中的class文件-二进制码,需要自己写类加载器)
Class clazz = myClassLoader.loadClass("Temp");
import java.lang.reflect.Method;
public class Name {
public static void main(String[] args) {
Method[] methods = null;
Field[] fields = null;
try {
Class classType = Class.forName("这里写你的类的名字");
methods = classType.getDeclaredMethods();
fields = classType.getDeclaredFields();
for(int i = 0; i < methods.length; i++) {
//获取方法的全部信息,例如:public void Print.print()
String methodStr = methods[i].toString();
//System.out.println(methodStr);
//截取方法的名字,例如:print
System.out.println("方法的名字: " + methodStr.substring(methodStr.indexOf(".") + 1, methodStr.indexOf("(")));
}
for(int i = 0; i < fields.length; i++) {
//完整的属性信息
String fieldStr = fields[i].toString();
//System.out.println(fieldStr);
//经过截取得到属性的名字
System.out.println("属性的名字: " + fieldStr.substring(fieldStr.lastIndexOf(".") + 1, fieldStr.length()));
}
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
}
}
那个,java到class的过程,应该不叫反射。
这个过程应该叫编译。记住,叫,编译。要想完成楼主的目的,可以有两个途径。
一个是将java文件编译成class文件,然后,用java的反射功能查看类属性。
但是,这要求java文件,必须要成功的编译成class文件才行。
另一个是自己想办法解析那个java文件,把里面的方法和属性找出来。
但是,这个编程复杂度要大很多。一般采用第一种方案。
怎么编译,要看楼主的JDK版本了。JDK6增强了动态编译的功能,可以直接使用;
而以前的版本,可以使用apache的工具包(tomcat里面好像就使用了这个),
如果运行环境也安装的JDK,也可以使用控制台命令进行编译。(此方法不推荐)
反射的话,太简单了,网上随便搜索一下,就能查到代码。
先把.java文件编译成.class,然后使用反射.
6楼正解