java反射机制调用

代码中包含两个类:

Student.java提供方法

TestClassMethod.java远程调用Student中的方法的例子

---------------------------------------------------------------------------------

package com.java.demo.klass;

import java.util.List;

public class Student {
    String name;
    public Student(){
        this.name = "This is the name of Student!";
    }
    public Student(String name){
        this.name = name;
    }
    public void showName(){
        System.out.println(name);
    }
    public void print(String value){
        System.out.println(value);
    }
    protected void protectedPrint(String value){
        System.out.println(value);
    }
    
    public static void main(String[] args){
        System.out.println("in main method.");
        for (int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
    
    public void multiParames(String[] p1, List p2){
        System.out.println("in multiParames method.");
        for (int i = 0; i < p1.length; i++) {
            System.out.println(p1[i]);
        }
        
        for (int i = 0; i < p2.size(); i++) {
            System.out.println(p2.get(i));
        }
    }
}

----类分割线,上面是Student---下面是反射机制调用这个Student中内部方法-------------------------------------------------------------------------------------------------



package com.java.demo.klass;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class TestClassMethod {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            Class yourClass = Class.forName("com.java.demo.klass.Student");// 假设你要动态加载的类为YourClass
            // 方法1:调用不带参数的构造函数,获得实例。
            Student student = (Student) yourClass.newInstance();
            student.showName();

            // 方法2:调用含有参数的构造函数<重要>
            // http://hi.baidu.com/daviddai/blog/item/20f2e31f620f5360f624e4da.html
            //定义形式参数
            Class[] parameterTypes = new Class[1];// 这里你要调用的方法只有一个参数
            parameterTypes[0] = String[].class;//参数类型是string数组
            Method method1 = yourClass.getDeclaredMethod("main", parameterTypes); // 参数类型为String
            //定义实际参数
            Object[] argsP = new Object[1];
            String[] argments = new String[2];//假设你要传入两个参数   
            argments[0] = "OK";   
            argments[1] = "NO";   
            argsP[0] = argments;   
            //调用方法。
            method1.invoke(yourClass.newInstance(), argsP);
            
            
            //方法3:调用内部public方法。
            Method method2 = yourClass.getDeclaredMethod("print", String.class); // 参数类型为String
            method2.invoke(yourClass.newInstance(), "test");
            //方法4:调用内部protected方法。
            Method method3 = yourClass.getDeclaredMethod("protectedPrint", String.class); // 参数类型为String
            method3.invoke(yourClass.newInstance(), "protectedPrint");
            
            //方法5:调用内部多个参数方法
            Class[] parames = new Class[2];
            parames[0] = String[].class;
            parames[1] = List.class;
            //根据参数类型和数量取得,method对象,由于远程类中可用有方法名是一样的方法(重载),这样加上了参数类型就能够定位到具体的某个方法。
            Method method4 = yourClass.getMethod("multiParames", parames);
            
            //定义实际参数
            Object[] pObjects = new Object[2];
            String[] p1 = {"p1_1","p1_2"};
            pObjects[0] = p1;
            
            List p2 = new ArrayList();
            p2.add("p2_1");
            p2.add("p2_2");
            pObjects[1] = p2;
            //放射机制调用方法。
            method4.invoke(yourClass.newInstance(), pObjects);

        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值