通过反射获取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 @Test 18 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 @Test 28 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 @Test 11 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,int 18 } 19 System.out.println(p);//name:jjz,age:25 20 }
------------------------分割线--------------------------------
操作普通方法:
1 package com.反射; 2 3 import java.lang.reflect.Method; 4 5 import org.junit.Test; 6 7 //操作普通方法 8 public class doMethod { 9 @Test 10 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);
------------------------分割线--------------------------------