Java反射

来源:互联网 发布:nc软件是什么 编辑:程序博客网 时间:2024/06/05 07:59

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

或者就是说反射是一面镜子,照什么就给你看什么。

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
一、通过Class类获取成员变量、成员方法、接口、超类、构造方法等
 
在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

package com.codeTest.fanshe;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class testMain {    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{         person bean = new person();         bean.setUname("张三");         bean.setAge(24);                   //得到类对象         Class userCla = bean.getClass();                 /*         * 得到类中的所有属性集合         */        Field[] fs = userCla.getDeclaredFields();                for(int i = 0 ; i < fs.length; i++)        {                    Field f = fs[i];            f.setAccessible(true); //设置些属性是可以访问的            Object val = f.get(bean);//得到此属性的值                     System.out.println("name:"+f.getName()+"\t value = "+val);                        String type = f.getType().toString();//得到此属性的类型                        if (type.endsWith("String"))            {               System.out.println(f.getType()+"\t是String");               f.set(bean,"12") ;        //给属性设值            }            else if(type.endsWith("int") || type.endsWith("Integer"))            {               System.out.println(f.getType()+"\t是int");               f.set(bean,12) ;       //给属性设值            }            else            {               System.out.println(f.getType()+"\t");            }                     }        System.out.println();        System.out.println();                /*         * 得到类中的方法         */        Method[] methods = userCla.getMethods();        for(int i = 0; i < methods.length; i++){            Method method = methods[i];            if(method.getName().startsWith("get")){               System.out.print("methodName:"+method.getName()+"\t");               System.out.println("value:"+method.invoke(bean));//得到get 方法的值            }        }                                                }}

person类只有两个属性:

private String uname;
private int age;


编译结果:

name:uname value = 张三

class java.lang.String 是String
name:age value = 24
int 是int

methodName:getUname value:12
methodName:getAge value:12
methodName:getClass value:class com.codeTest.fanshe.person

0 0
原创粉丝点击