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
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- [nginx]搭建
- 一个完整的Oracle建表的例子
- python截取二进制文件
- project设置工期为1个工作日,但开始时间与结束时间不是同一天,如何解决或者是设置?
- "08 :value too great for base" 的原因及解决办法
- Java反射
- Android APK的反编译和重新打包
- PHP后台守护进程的实现方式(Linux环境)
- Spring中数据源和数据库连接池配置的几种方法
- CodeForces 366A Dima and Guards
- 第十一讲 $resource 数据交互插件
- 系统的平均并发用户数和并发数峰值如何估算
- 佛珠详情页
- Node.JS之waterline 使用