反射

来源:互联网 发布:如何下载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
原创粉丝点击