Java反射获取属性、方法、构造器
2015-09-11 20:36
555 查看
获取属性:
获取方法:
获取构造器:
import java.lang.reflect.Field; import java.lang.reflect.Modifier; import org.junit.Test; public class TestField { //获取对应的运行时类的属性 @Test public void test1(){ Class clazz = Person.class; //1.getFields():只能获取到运行时类中及其父类中声明为public的属性 Field[] fields = clazz.getFields(); for(int i = 0;i < fields.length;i++){ System.out.println(fields[i]); } System.out.println(); //2.getDeclaredFields():获取运行时类本身声明的所有的属性 Field[] fields1 = clazz.getDeclaredFields(); for(Field f : fields1){ System.out.println(f.getName()); } } //权限修饰符 变量类型 变量名 //获取属性的各个部分的内容 @Test public void test2(){ Class clazz = Person.class; Field[] fields1 = clazz.getDeclaredFields(); for(Field f : fields1){ //1.获取每个属性的权限修饰符 int i = f.getModifiers(); String str1 = Modifier.toString(i); System.out.print(str1 + " "); //2.获取属性的类型 Class type = f.getType(); System.out.print(type.getName() + " "); //3.获取属性名 System.out.print(f.getName()); System.out.println(); } } //调用运行时类中指定的属性 @Test public void test3() throws Exception{ Class clazz = Person.class; //1.获取指定的属性 //getField(String fieldName):获取运行时类中声明为public的指定属性名为fieldName的属性 Field name = clazz.getField("name"); //2.创建运行时类的对象 Person p = (Person)clazz.newInstance(); System.out.println(p); //3.将运行时类的指定的属性赋值 name.set(p,"Jerry"); System.out.println(p); System.out.println("%"+name.get(p)); System.out.println(); //getDeclaredField(String fieldName):获取运行时类中指定的名为fieldName的属性 Field age = clazz.getDeclaredField("age"); //由于属性权限修饰符的限制,为了保证可以给属性赋值,需要在操作前使得此属性可被操作。 age.setAccessible(true); age.set(p,10); System.out.println(p); // Field id = clazz.getField("id"); } }
获取方法:
import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import org.junit.Test; public class TestMethod { //1.获取运行时类的方法 @Test public void test1(){ Class clazz = Person.class; //1.getMethods():获取运行时类及其父类中所有的声明为public的方法 Method[] m1 = clazz.getMethods(); for(Method m : m1){ System.out.println(m); } System.out.println(); //2.getDeclaredMethods():获取运行时类本身声明的所有的方法 Method[] m2 = clazz.getDeclaredMethods(); for(Method m : m2){ System.out.println(m); } } //注解 权限修饰符 返回值类型 方法名 形参列表 异常 @Test public void test2(){ Class clazz = Person.class; Method[] m2 = clazz.getDeclaredMethods(); for(Method m : m2){ //1.注解 Annotation[] ann = m.getAnnotations(); for(Annotation a : ann){ System.out.println(a); } //2.权限修饰符 String str = Modifier.toString(m.getModifiers()); System.out.print(str + " "); //3.返回值类型 Class returnType = m.getReturnType(); System.out.print(returnType.getName() + " "); //4.方法名 System.out.print(m.getName() + " "); //5.形参列表 System.out.print("("); Class[] params = m.getParameterTypes(); for(int i = 0;i < params.length;i++){ System.out.print(params[i].getName() + " args-" + i + " "); } System.out.print(")"); //6.异常类型 Class[] exps = m.getExceptionTypes(); if(exps.length != 0){ System.out.print("throws "); } for(int i = 0;i < exps.length;i++){ System.out.print(exps[i].getName() + " "); } System.out.println(); } } //调用运行时类中指定的方法 @Test public void test3() throws Exception{ Class clazz = Person.class; //getMethod(String methodName,Class ... params):获取运行时类中声明为public的指定的方法 Method m1 = clazz.getMethod("show"); Person p = (Person)clazz.newInstance(); //调用指定的方法:Object invoke(Object obj,Object ... obj) Object returnVal = m1.invoke(p);//我是一个人 System.out.println(returnVal);//null Method m2 = clazz.getMethod("toString"); Object returnVal1 = m2.invoke(p); System.out.println(returnVal1);//Person [name=null, age=0] //对于运行时类中静态方法的调用 Method m3 = clazz.getMethod("info"); m3.invoke(Person.class); //getDeclaredMethod(String methodName,Class ... params):获取运行时类中声明了的指定的方法 Method m4 = clazz.getDeclaredMethod("display",String.class,Integer.class); m4.setAccessible(true); Object value = m4.invoke(p,"CHN",10);//我的国籍是:CHN System.out.println(value);//10 } }
获取构造器:
import java.lang.reflect.Constructor; import org.junit.Test; public class TestConstructor { @Test public void test1() throws Exception{ String className = "com.iting.java.Person"; Class clazz = Class.forName(className); //创建对应的运行时类的对象。使用newInstance(),实际上就是调用了运行时类的空参的构造器。 //要想能够创建成功:①要求对应的运行时类要有空参的构造器。②构造器的权限修饰符的权限要足够。 Object obj = clazz.newInstance(); Person p = (Person)obj; System.out.println(p); } @Test public void test2() throws ClassNotFoundException{ String className = "com.iting.java.Person"; Class clazz = Class.forName(className); Constructor[] cons = clazz.getDeclaredConstructors(); for(Constructor c : cons){ System.out.println(c); } } //调用指定的构造器,创建运行时类的对象 @Test public void test3() throws Exception{ String className = "com.aiting.java.Person"; Class clazz = Class.forName(className); Constructor cons = clazz.getDeclaredConstructor(String.class,int.class); cons.setAccessible(true); Person p = (Person)cons.newInstance("罗伟",20); System.out.println(p); } }
相关文章推荐
- JAVA设计模式(08):结构化-飞锤(Flyweight)
- 自定义spring schema简化与canal集成
- jdk安装与卸载
- ajax的url调用Struts 2的action方法,浏览器提示Not Found
- 【Java多线程】-线程同步synchronized和volatile
- ubuntu14.04 搭建java环境
- Java并发和多线程(一)基础知识
- Java并发编程:深入剖析ThreadLocal
- 面向对象编程(OOP)的五大特征-java学习之旅(1)
- 面向对象编程(OOP)的五大特征-java学习之旅(1)
- 面向对象编程(OOP)的五大特征-java学习之旅(1)
- Java排序汇总
- 面向对象编程(OOP)的五大特征-java学习之旅(1)
- javac compile java project and run
- 使用spring @Scheduled注解执行定时任务
- jsp页面加载过程中执行struts 2的action
- SpringMVC中使用Interceptor拦截器
- Java——自娱自乐(简单弹窗)
- 冒泡排序算法的java实现
- 多数据源问题--Spring+Ibatis 访问多个数据源(非分布式事务)