反射
来源:互联网 发布:如何下载excel2013软件 编辑:程序博客网 时间:2024/06/06 04:40
通过反射获取Class类的三种方式:
1 //第一种2 Class c1 = Person.class;3 //第二种4 Class c2 = new Person().getClass();5 //第二种6 Class c3 = Class.forName("类的路径");
------------------------分割线--------------------------------
操作无参构造方法:
1 package com.反射; 2 3 import java.lang.reflect.Constructor; 4 5 import org.junit.Test; 6 7 public class 操作构造方法 { 8 public static void main(String[] args) throws Exception { 9 //通过反射获取Class类的三种方法10 Class c = Class.forName("com.反射.Person");11 Class c1 = Person.class;12 Class c2 = new Person().getClass();13 14 }15 16 //获取无参构造方法17 @Test18 public void test() throws Exception, Exception{19 Class c3 = new Person().getClass();20 Person p = (Person) c3.newInstance();21 p.setAge(11);22 p.setName("sss");23 System.out.println(p.getAge()+","+p.getName());24 }25 26 //获取有参构造方法27 @Test28 public void test1() throws Exception{29 Class c4 = Person.class;30 Constructor cs = c4.getConstructor(String.class,int.class);31 Person p1 = (Person) cs.newInstance("qq",22);32 System.out.println(p1.getName()+","+p1.getAge());33 }34 35 }
------------------------分割线--------------------------------
操作属性:
1 package com.反射; 2 3 import java.lang.reflect.Field; 4 5 import org.junit.Test; 6 7 public class doFileds { 8 9 //操作属性10 @Test11 public void test() throws Exception{12 Class c1 = Person.class;13 Class c2 = new Person().getClass();14 Class c3 = Class.forName("com.反射.Person");15 Person p = (Person) c3.newInstance();16 Field f = c3.getDeclaredField("name");17 f.setAccessible(true);//属性为private时,设置权限18 f.set(p, "zhangsan");19 System.out.println(f.get(p));20 21 }22 }
1 @Test 2 public void getFields() throws Exception{ 3 //Class c = Person.class; 4 Class c1 = new Person().getClass(); 5 //Class c2 = Class.forName("com.wxkj.Person"); 6 Person p = (Person)c1.newInstance();//创建实例对象 7 Field[] f = c1.getDeclaredFields();//获得该类所有的属性,相当于一个数组 8 for(int i = 0;i<f.length;i++){//遍历属性数组 9 Field f1 = f[i];10 String type = f1.getType().toString();//获取属性的类型11 f1.setAccessible(true);//设置权限,如果是private修饰的属性不加这行代码就获取不到12 if(type.endsWith("String")){//判断该属性是否是String类型13 f1.set(p, "jjz");14 }else if(type.endsWith("int")){//判断该属性是否是int类型15 f1.set(p,25);16 }17 System.out.println(type);//class java.lang.String,int18 }19 System.out.println(p);//name:jjz,age:2520 }
------------------------分割线--------------------------------
操作普通方法:
1 package com.反射; 2 3 import java.lang.reflect.Method; 4 5 import org.junit.Test; 6 7 //操作普通方法 8 public class doMethod { 9 @Test10 public void test() throws Exception{11 Class c = Person.class;12 Person p = (Person) c.newInstance();13 Method m = c.getDeclaredMethod("setName", String.class);//获取的是类自身声明的所有方法,包含public、protected和private方法。14 // Method m = c.getMethod("setName", String.class);//获取的是类的所有共有方法,这就包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。15 m.invoke(p, "zhangsan");16 System.out.println(p.getName());17 }18 }
如果是私有的方法,需设置 m.setAccessible(true);
如果是静态方法,则不需要实例对象,实例对象为null,如果此静态方法没有参数,则m.invoke(null, null);
------------------------分割线--------------------------------
0 0