• Java反射研究(2)


    接Java反射研究(1)


    九、调用特定方法


    Method m = c1.getMethod("funcname",Class<?>...c);   //funcname表示调用方法的名称,c表示参数的Class对象

    例如:Method m = c1.getMethod("fun",String.class,int.class);    表示调用fun(String,int);函数

    Object obj = m.invoke(c1.newInstance(),"xiazdong",20);   //如果有返回值,则invoke函数返回;

    注:如果是调用静态的方法,则不需要设置对象;

    Object obj = m.invoke(null,"xiazdong");


    注:如果参数中有数组,比如 public static void main(String[]args);

    Method m = c1.getMethod("main",String[].class);

    m.invoke(null,(Object)new String[]{"aa","bb"});是对的;

    m.invoke(null,new String[]{"aa","bb"}); 会调用 main(String,String);函数;



    十、调用特定属性


    Field f = c1.getDeclaredField("name");    //返回name属性

    f.setAccessible(true);    //私有属性可见

    String name = (String)f.get(Object obj);   //返回obj对象的name属性的值

    f.set(Object obj,String n);      //设置obj对象的name属性为n值;


    十一、操作数组


    int tmp[] = {1,2,3};

    Class<?> c  = tmp.getClass().getComponentType();

    Array.getLength(tmp);        //tmp数组的长度

    c.getName();           //获得数组类型名称

    Array.get(Object obj,int index);      //获得obj数组的index索引的数值

    Array.set(Object obj,int index,VALUE);    //设置obj数组的index索引的数值为value;

    Object obj  = Array.newInstance(c,length);          //c为数组的类型,length为数组的长度;obj为返回的数组对象;


    示例:


    import java.lang.reflect.*;
    public class GetMethodDemo01{
    	public static void main(String args[])throws Exception{
    		Class<?> c1 = Class.forName("Person");
    		Method m = c1.getMethod("sayHello");
    		m.invoke(c1.newInstance());
    		Method m2 = c1.getMethod("sayHello2",String.class,int.class);
    		String str = (String)m2.invoke(c1.newInstance(),"xiazdong",123);
    		System.out.println(str);
    		Field nameField = c1.getDeclaredField("name");
    		Field ageField = c1.getDeclaredField("age");
    		nameField.setAccessible(true);
    		ageField.setAccessible(true);
    		Person obj = (Person)c1.newInstance();
    		obj.setName("xzdong");
    		obj.setAge(12);
    		System.out.println(nameField.get(obj));
    		System.out.println(ageField.get(obj));
    		Method setName = c1.getMethod("setName",String.class);
    		setName.invoke(obj,"changed");
    		Method getName = c1.getMethod("getName");
    		System.out.println(getName.invoke(obj));
    
    		int tmp[] = {1,2,3};
    		Class<?> c3 = tmp.getClass().getComponentType();
    		System.out.println(c3.getName());
    		System.out.println("第一个数:"+Array.get(tmp,0));
    		Array.set(tmp,0,5);
    		System.out.println("第一个数:"+Array.get(tmp,0));
    
    		Object arr = Array.newInstance(c3,5);
    		System.arraycopy(tmp,0,arr,0,Array.getLength(tmp));
    		System.out.println(Array.get(arr,2));
    		System.out.println(Array.get(arr,3));
    	}
    }

    import java.lang.reflect.*;
    interface China{
    	public static final String NAME = "CHINA";
    	public int AGE = 60;
    	public void sayHello();
    	public String sayHello2(String name,int age);
    }
    class Person implements China{
    	private String name;
    	private int age;
    	public String getName(){
    		return name;
    	}
    	public void setName(String name){
    		this.name = name;
    	}
    	public int getAge(){
    		return age;
    	}
    	public void setAge(int age){
    		this.age = age;
    	}
    	public void sayHello(){
    		System.out.println(NAME+"  "+AGE);
    	}
    	public String sayHello2(String name,int age){
    		return name+" "+age;
    	}
    }


    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    Scrapy学习篇(九)之文件与图片下载
    Scrapy学习篇(八)之settings
    SQL拾遗
    SQL命令导入导出
    Spring Security构建Rest服务-1401-权限表达式
    Spring Security构建Rest服务-1400-授权
    Spring Security构建Rest服务-1300-Spring Security OAuth开发APP认证框架之JWT实现单点登录
    Spring Security构建Rest服务-1205-Spring Security OAuth开发APP认证框架之Token处理
    Spring Security构建Rest服务-1204-Spring Security OAuth开发APP认证框架之Token处理
    Spring Security构建Rest服务-1203-Spring Security OAuth开发APP认证框架之短信验证码登录
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058124.html
Copyright © 2020-2023  润新知