Java反射

一.前言


最近在开发中用到了反射,但是由于之前很少用到,所以又找了一些资料,在晚上看到了一篇不错的博客,总结的很全面。

转自:http://blog.csdn.net/u011068702/article/details/49863931


二.正文


1.获取Class对象(一共有是3种方式):

1)通过类名.class方式获得:

Class<?>  cType = ClassName.class;

2)通过Class.forName()方法获得:

Class<?>  cType = Class.forName("类全名");

3)通过对象名.getClass()方法获取:

Class<?> cType3 = objName.getClass();

三种方式的区别:

三种方式均能够获得Class对象,区别是方法一不执行静态块和动态构造块方法二执行静态块、不执行动态构造块方法三需要创建对象,静态块和动态构造块均会执行

注意:静态块仅在类加载时执行一次,若类已加载便不再重复执行;而动态构造块在每次new对象时均会执行。


2.获取实现接口

Class<?> inters[] = c.getInterfaces();  
for(int i=0;i<inters.length;i++){  
    System.out.print(inters[i].getName()+" "); //getName()方法为取得接口名称;  
}  


3.获取父类

Class<?> superClass  = c.getSuperclass();     //获得父类  
String name  = superClass.getName();    //获得父类名称  


4.获取构造方法

Constructor cons[] = c.getConstructors();         //获得公开的构造方法  
Constructor dcons[] = c.getDeclaredConstructors();        //获得全部构造方法  
String modifier = Modifier.toString(cons[i].getModifiers());   //获得访问权限  
String name = cons[i].getName();            //获得构造方法名称  
Class<?> params[] = cons[i].getParameterTypes();        //获得参数类型对象 


5.获取方法Method

Method ms[] = c.getMethods();                        //返回公共的全部方法,包括继承方法  
Method dms[] = c.getDeclaredMethods();        //返回本类全部方法,不包括继承的方法  
Class<?> rt = ms[i].getReturnType();  
Class<?>params[] = ms[i].getParameterTypes();  
String name = ms[i].getName();  
String modifier = Modifier.toString(ms[i].getModifiers());  
Class<?>ex[] = ms[i].getExceptionTypes();        //获得异常  
String name = ex[i].getName();            //获得异常名称  


6.获取字段Field

Field fs[] = c.getFields();                    //获得公共属性,包括继承属性  
Field dfs[] = c.getDeclaredFields();    // 获得本类全部属性  
Class<?> type = fs[i].getType();        //获得属性的类型对象  
String name = fs[i].getName();        //获得属性的名称  
String modifier = Modifier.toString(fs[i].getModifiers());  


7.通过反射创建一个对象

(1)  
Class<?> c = Class.forName("Person");  
Person p = (Person)c.newInstance();  
(2)  
Constructor con = c1.getConstructor(Class....param);  
Object obj = con.newInstance(Object obj);  //根据构造函数创建一个实例 
 
Class c = Class.forName("Person");  
Constructor<?> cons[] = c.getConstructors();  
Person p = (Person)cons[0].newInstance("xiazdong",15);  
注:如果调用的构造函数为私有,则需要c.setAccessible(true);  


8.调用特定方法

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);函数;


9.调用特定属性

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值;


10.操作数组

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.*;  
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;    
    }    
}    




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值