导航

反射

Posted on 2023-07-13 18:36  koodu  阅读(4)  评论(0编辑  收藏  举报

反射

反射机制:将类的各个组成部分封装为其他对象。

Java的类经过javac编译,生成class文件,在class文件中,一个类分为成员变量、构造方法、成员方法三类,再经过类加载器加载进内存,到内存中为class类对象,class类对象中成员变量为Field Field[]、构造方法为Constructor[]]、成员方法为Method

反射API

类的class文件获取
  1. Class c=Class.forname("完整包名");

    如:Class c1=Class.forName("com.flect.test.User");

  2. 类名.class:通过类名的属性class获取

  3. 对象.getclass():通过getclass()方法获取,getclass方法在object类中已定义

Java中任何一种类型,包括基本数据类型都有.class属性。string.class;int.class;Date.class;

对于基本数据类型和包装数据类型,如int和Integer两个的class不同

Class c1=int.class;
Class c2=Integer.class;
System.out.println(c1==c2);
        
结果 ==>false

同一个字节码文件.class在一次程序运行过程中,只会被加载一次,获取到的class对象都是同一个

class对象可以获取成员变量[]、构造方法[]、成员方法[]、获取类名
获取class类文件的变量、方法

Class c=string.class;

  1. 获取成员变量

    1.Field[] files=c.getFields();//获取所有public成员变量
    2.Field[] files=c.getDeclareFields();//获取所有属性
    3.Field getDeclaredField(String name);//根据变量名获取属性
    对于获取的私有的会有安全问题,要先忽略安全问题Field.setAccessible(true);
    
    //string a;
    Field a=c.getField("a");//获取class文件c的a的成员变量对象
    //实例化对象person p=new Person();
    Object value=a.get(p);//通过成员变量a对象调用get方法知道传入的对象的对应a变量的值
    
    //设置对象的a变量的值
    a.set(p."lisi");
    
  2. 构造方法

    //获取class文件的形参是string,int的构造方法的class对象
    Constructor c=Class.getConstructor(String.class,int.class);
    //创建对象
    Object obj=c.newInstance("lisi",13);
    //空参的构造方法直接使用class对象的newInstance
    Object o=Class.newInstance();
    
  3. 获取成员方法

    class Person{
      public void func(){}
      public void func(String s){}
    }
    1.获取指定名称的方法(无参)
    Method fun=Class.getMethod("func");
    Person p=new Person();//对象
    //执行方法
    fun.invoke(p);
    2.获取有参的
    Method fun=Class.getMethod("func",String.class);
    Person p=new Person();//对象
    //执行方法
    fun.invoke(p,"lisi");
    -------------------------------------------
    获取所有public方法Method[] ms=Class.getMethods();
    
  4. 获取类名

    String className=Class.getName();
    

配置文件与反射结合

将要使用的类的全类名写在配置文件上,加载读取配置文件信息,使用反射创建对象

在src下创建配置文件classinfo.properties
username=com.flect.test.User
--------------------------------------
public static void main(String[] args) throws Exception
{
  FileReader f= new FileReader("反射/classinfo.properties");//打开文件;
  Properties p=new Properties();
  p.load(f);//加载try文件;
  f.close();
  String user=p.getProperty("username");
  Class c2=Class.forName(user);
  Object obj=c2.newInstance();//==>2222222222
  System.out.println(obj);//==》ssssss
}
----------------------------------------
user类
package com.flect.test;

public class User
{
   User(){
       System.out.println("2222222222");
   }
   public String toString(){
       return "ssssss";
   }
}