谁帮写一段代码
功能
给定包名类名后
可以查出这个类中有什么属性,属性类型
有什么方法,方法的参数,参数个数
我知道用反射机制,麻烦帮写一下
注释一下
[b]问题补充:[/b]
获得方法参数的名称是用什么方法?
[b]问题补充:[/b]
我想获得完整的方法
比润 public String print(String s)
[code="java"]
package utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ReflectTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Class clazz = Class.forName("utils.FileUtils");
Field[] fields = clazz.getDeclaredFields();
Method[] methods = clazz.getDeclaredMethods();
System.out.println("--------------- 属性如下 -----------------");
for(Field field : fields){
int mod = field.getModifiers();
System.out.println(Modifier.toString(mod) //取得修饰符
+ " " + field.getType().getName() //取得类型名
+ " " + field.getName()); //取得属性名
}
System.out.println("--------------- 方法如下 -----------------");
for(Method method : methods){
StringBuffer methodBuffer = new StringBuffer();
int mod = method.getModifiers();
methodBuffer.append(Modifier.toString(mod)) //取得修饰符
.append(" ").append(method.getReturnType().getName()) //取得返回值类型
.append(" ").append(method.getName()) //取得方法名
.append("(");
for(Class ss : method.getParameterTypes()){
methodBuffer.append(ss.getName()).append(","); //取得参数
}
methodBuffer.deleteCharAt(methodBuffer.lastIndexOf(",")); //去掉最后一个","
methodBuffer.append(")");
System.out.println(methodBuffer.toString()); //打印输出
}
}
}
[/code]
[quote]我想获得完整的方法
比润 public String print(String s)[/quote]
据我所知,是不能通过反射获得方法的具体参数,如上面的s,因为Java的Class文件根本就不会存储一个方法的参数名。不过你的这个要求可以通过一些第三方类库来完成,比如:ParaNamer(具体内容参考它的官方网站http://paranamer.codehaus.org/)
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
得到某个对象的属性 1 public Object getProperty(Object owner, String fieldName) throws Exception { 2 Class ownerClass = owner.getClass(); 3 4 Field field = ownerClass.getField(fieldName); 5 6 Object property = field.get(owner); 7 8 return property; 9 } Class ownerClass = owner.getClass():得到该对象的Class。 Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。 Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。
2. 得到某个类的静态属性 1 public Object getStaticProperty(String className, String fieldName) 2 throws Exception { 3 Class ownerClass = Class.forName(className); 4 5 Field field = ownerClass.getField(fieldName); 6 7 Object property = field.get(ownerClass); 8 9 return property; 10 } Class ownerClass = Class.forName(className) :首先得到这个类的Class。 Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。 Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。
3. 执行某对象的方法 1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception { 2 3 Class ownerClass = owner.getClass(); 4 5 Class[] argsClass = new Class[args.length]; 6 7 for (int i = 0, j = args.length; i < j; i++) { 8 argsClass[i] = args[i].getClass(); 9 } 10 11 Method method = ownerClass.getMethod(methodName, argsClass); 12 13 return method.invoke(owner, args); 14 } Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。 5~9行:配置参数的Class数组,作为寻找Method的条件。
看看这文章,里面有代码
http://www.iteye.com/topic/137944
哎。。。。这种问题应该baidu或google。。。
首先Bean在符合JavaBean的要求,即有一个无参的构造方法,所有属性都有一个set和get方法并且set与get方法是set/get+属性名称(属性名称先字母大写)
public class User {
private int id;
private String name;
private Date birthday;
private float money;
public User() {
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ORMTest {
public static void main(String[] args) throws SQLException,
IllegalAccessException, InvocationTargetException, Exception {
User user = (User) getObject(
"select id as Id, name as Name, birthday as Birthday, money as Money from user where id=1",
User.class);
//这里取别名就是为了便列名加set或get就可以是JavaBean中属性的set或get方法
System.out.println(user);
Bean b = (Bean) getObject(
"select id as Id, name as Name, birthday as Birthday, money as Money from user where id=1",
Bean.class);
System.out.println(b);
}
private static String[] getColNames(ResultSet rs) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
String[] colNames = new String[count];
for (int i = 1; i <= count; i++) {
colNames[i - 1] = rsmd.getColumnLabel(i);
}
return colNames;
}
static Object getObject(String sql, Class clazz) throws SQLException,
Exception, IllegalAccessException, InvocationTargetException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
String[] colNames = getColNames(rs);//得到所有的列名
Object object = null;
Method[] ms = clazz.getMethods();//得到javaBean中所有set或get方法
if (rs.next()) {
object = clazz.newInstance();
for (int i = 0; i < colNames.length; i++) {
String colName = colNames[i];
String methodName = "set" + colName;//得到set或get方法名
for (Method m : ms) {
if (methodName.equals(m.getName())) {
m.invoke(object, rs.getObject(colName));//调用set方法,将该列的值放到set方法当中去.
break;
}
}
}
}
return object;
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
}
再没学过反射机制的时候感觉挺神秘似的,其实很简单,看看相关例子就明白了,说白了他就是根据对象所属类及构造函数名字,在运行是人以调用而已。
没有什么意义啊,你试试用反射写一个获得表单值,放到javabean中
这个还是比较有意思的~~~
还得研究研究
为什么大家都不喜欢用代码显示功能呢 代码没有格式和高亮看起来让人很郁闷的
我下面的代码完全实现了你说的,自己打开ide试试看
[code="java"]import java.lang.reflect.*;
/**
*
@author zhiweiv
*/
public class BeanInfo {
public static void print(String className) throws ClassNotFoundException {
Class clazz = Class.forName(className);//动态加载类,获取类的class
Field[] fields = clazz.getDeclaredFields();//获取全部属性
Method[] methods = clazz.getDeclaredMethods();//获取全部方法
//使用增强for循环输出属性名和其声明类的名字
for (Field f : fields) {
System.out.println("属性名字:" + f.getName() + "属性类型:" + f.getType().getName());
}
for (Method m : methods) {
System.out.println("方法名字"+m.getName() + "参数个数:"+m.getParameterTypes().length);
//输出方法的参数类型
for (Class claz : m.getParameterTypes()) {
System.out.print(" 参数类型:" + claz.getName());
}
}
}
}[/code]