反射

通过反射获取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);

 ------------------------分割线--------------------------------

原文地址:https://www.cnblogs.com/jiangjianzhu/p/5486650.html