• 反射


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

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

  • 相关阅读:
    Spring 发生 has not been refreshed yet 异常
    rsyslog config
    grok
    阿里云态势
    Unity的asm笔记
    Unity2020或Unity2019安装后无法启动
    rider代码折叠
    使用rider调试lua
    MacType更好的字体渲染
    Unity字体和画面花屏处理
  • 原文地址:https://www.cnblogs.com/jiangjianzhu/p/5486650.html
Copyright © 2020-2023  润新知