Java反射机制

一、获取类的属性,构造函数

package com.whzl.reflect;

import java.lang.reflect.*;

public class ReflectHello {

 /**
  * @param args
  */
 public static void main(String[] args) {
  StringBuffer sb;
  try {
   //首先获取Class
   Class cls = Class.forName("com.whzl.Hello");
   //获取类的属性(Field)
   Field fs[] = cls.getFields();
   
   System.out.println("----------Field------------");
   for(Field f:fs)
   {
    sb = new StringBuffer();
    //默认取得的修饰符为整数,由几个修饰符叠加。需要用Modifier的toString转化一下
    //String FieldM = "Field修饰符:" + Modifier.toString(f.getModifiers());
    sb.append(Modifier.toString(f.getModifiers()));
    //获取变量类型
    //String FieldT = "Field类型:" + f.getType();
    sb.append(" " + f.getType().getName());
    //获取变量名称
    //String FieldN = "Field名称:" + f.getName()
    sb.append(" " + f.getName());
    //f.get(),返回指定对象上此Field的值,因此需要传入对象。需要传入对象
    //String FieldV = "Field值:" + f.get(cls.newInstance());
    sb.append(" = " + f.get(cls.newInstance()));
    System.out.println(sb.toString());
    Object object = cls.newInstance();
    System.out.println("修改前:" + f.get(object));
    f.set(object, "修改了!嘎嘎!");
    System.out.println("修改后:" + f.get(object));
    sb = null;
   }
   
   System.out.println("---------Constructor--------");
   Constructor cs[] = cls.getConstructors();
   for(Constructor c: cs)
   {
    //首先获取修饰符
    System.out.print(Modifier.toString(c.getModifiers()));
    //构造方法名称
    System.out.print(" " + c.getName());
    //获取参数类
    Class ts [] = c.getParameterTypes();
    for(Class t:ts)
    {
     System.out.print(" " + t.getName());
    }
    System.out.println();
   }
   
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}
二、调用构造函数

package com.whzl.reflect;

import java.lang.reflect.Constructor;

import com.whzl.Hello;

public class CallHelloConstructor {

 /**
  * @param args
  */
 public static void main(String[] args) {
  try {
   //获得类
   Class cls = Class.forName("com.whzl.Hello");
   //构造函数是根据参数类型去寻找的
   Class parmsType [] = new Class[3];
   parmsType[0] = String.class;
   parmsType[1] = String.class;
   parmsType[2] = Integer.TYPE;
   
   Constructor con = cls.getConstructor(parmsType);
   
   //设置参数
   Object obj[] = new Object[3];
   obj[0] = "风影";
   obj[1] = "程序员";
   obj[2] = 25;
   //实例化
   Hello hello = (Hello)con.newInstance(obj);
   
   //调用无参构造方法
   cls.getConstructor(null).newInstance(null);
   
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}

 

三、调用方法

package com.whzl.reflect;

import java.lang.reflect.Method;

public class CallHelloMethod {

 /**
  * @param args
  */
 public static void main(String[] args) {
  try
  {
   //获得类
   Class cls = Class.forName("com.whzl.Hello");
   //获取所有的方法
   Method [] ms = cls.getMethods();
   
   for(Method m:ms)
   {
    System.out.print(m.getName());
    System.out.print(" " + m.getReturnType().getName());
    Class ts [] = m.getParameterTypes();
    for(Class t:ts)
    {
     System.out.print(" " + t.getName());
    }
    System.out.println();
   }
   //我们这里调用sayHelloToSb,通过方法名和参数类型获取方法,多参数可以使用数组
   Method m = cls.getMethod("sayHelloToSb", String.class);
   
   //设置参数
   //实例化对象
   System.out.println("------------------------------");
   Object obj = cls.newInstance();
   System.out.println("------------------------------");
   //调用方法,并设置参数的值,多参数可以使用数组
   Object result = m.invoke(obj, "Jay Chou");
   System.out.println(result);
  }
  catch(Exception e)
  {
   
  }
 }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值