java通过反射调类中的某个方法和获得类中的元素。

使用java的反射机制获得类中的方法并执行方法:

执行某个方法:

实体类:

package com.xy.user;
/*
 * description 实体类
 */
public class Users {
	private String userName;
	
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
}
测试类:

package com.xy.user;
public class Test {
    public static void main(String[] args) throws Exception {
        Test test = new Test();
        Users user = new Users();
        test.execute(user, "com.xy.user.Users",
                "setUserName", "许阳");
        System.out.println(user.getUserName());
    }

    public void execute(Object obj, String className, String methodName,
            String paramerValue) throws Exception {
        
            /*
             * 首先根据完整的包名+类名获得类的Class,不是class
             * Class就是类的类,用来描述某个类有那些字段,方法,构造器等。
             * 这样也可以获得实体类,即参数中的invoke参数中的obj:
             * Users user =(Users)Class.forName("com.xy.user.Users").newInstance();
             * 也可以这样获得Class:Users user = new Users(); Class cls = user.getClass();
             */
            Class cls = Class.forName(className);
            /*
             * 获得到class,class的getMethod(方法名,参数类型)可获得class中的某方法.
             * 一个class可能有多个名字一样,参数不同的方法,所以要用方法名和参数类型来获得。
             * 如果有多个参数,使用cls.getMethod(methodName, new Class[] { int.class,String.class })
             */
            Method method = cls.getMethod(methodName, String.class);
            //通过反射执行方法。invoke(类,参数值);
            method.invoke(obj, paramerValue);
    }
}

 运行结果: 

许阳

例子:

package com.xy.reflect;

import java.lang.reflect.*;
 
public class Test {
   public String name;
   private int age=25;
   String password;
   public static void main(String [] args) throws Exception{
       Test obj = new Test();
       Class  cls = obj.getClass();
       Field[] fields = cls.getDeclaredFields();
       for(Field f : fields){
           System.out.println("name :" + f.getName());
           System.out.println("type :" + f.getType().getName());
           System.out.println("class :" + f.getDeclaringClass());
           System.out.println("value :" + f.get(obj));
           int mod = f.getModifiers();
           System.out.println("modifiers :"+ Modifier.toString(mod));
           System.out.println("------------------------");
       }
   }
}
执行的结果:

name :name
type :java.lang.String
class :class com.xy.reflect.Test
value :null
modifiers :public
------------------------
name :age
type :int
class :class com.xy.reflect.Test
value :25
modifiers :private
------------------------
name :password
type :java.lang.String
class :class com.xy.reflect.Test
value :null
modifiers :
------------------------
备注:

Field(method)的getModifiers()方法返回int类型值表示该字段的修饰符。其中,该修饰符是java.lang.reflect.Modifier的静态属性。

对应表如下:

PUBLIC: 1  PRIVATE: 2  PROTECTED: 4  STATIC: 8
FINAL: 16  SYNCHRONIZED: 32     VOLATILE: 64     TRANSIENT: 128
NATIVE: 256   INTERFACE: 512      ABSTRACT: 1024    STRICT: 2048


可以通过Modifier.toString(int mod)得到对应的修饰符;


通过反射获得类中的元素:


获得本类中的元素:

获得变量:

Class cl = 类名.class;
Field[] fs = cl.getField();//得到公用的变量(public)
Field[] fs1 = cl.getDeclaredField();//得到所有的变量(public private protect)

获得方法:

Class cl = 类名.class;
Method[] mt = cl.getMethod();//得到公共的方法(包括继承来的)
Method[] mt1 = cl.getDeclaredField();//得到所有的方法(不包括继承来的)

获得构造方法:

Class cl = 类名.class;
Constructor[] con = cl.getConstructor();//得到公共的构造函数(public)
Constructor[] con1 = cl.getDeclaredConstructor();//得到所有的构造函数(public,private,protect)

获得包名+类名:

Class cls = Test.class;
System.out.println(cls.getName());

获得方法返回值类型和参数类型:

Class cls = Class.forName("com.xy.Test");
Method[] med = cls.getMethods();
for(Method m :med){
	//得到返回值类型
	Class returnType = m.getReturnType();
	//得到参数类型,一个方法可能有多个参数
	Class paraType[] = m.getParameterTypes();
}

获得类加载器:

Class cls = Class.forName("com.xy.Test");
cls.getClassLoader().getClass().getName();


获得其他类的元素:

获得接口:

Class cls = Class.forName("com.xy.Test");
Class<?> inter = cls.getInterfaces();

获得父类:

Class cls = Class.forName("com.xy.Test");
Class<?> superClass = cls.getSuperclass();


其他:

获得Class的3种方式:

Class cls = Class.forName("com.xy.Test");
Class cls1 = Test.class;
Class cls2 = new Test().getClass();

通过Class反向得到类的实例:

Class cls = Class.forName("com.xy.Test");
Test test =  (Test)cls.newInstance();






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值