首页 > 其他分享 >反射

反射

时间:2023-07-13 18:45:27浏览次数:31  
标签:反射 String 对象 public Class 获取 class

反射

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

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";
   }
}

标签:反射,String,对象,public,Class,获取,class
From: https://www.cnblogs.com/persistencejunjie/p/17551791.html

相关文章

  • .NET通过反射实现依赖注入
    设计通过反射实现依赖注入classProgram{//获取到当前程序的程序集,并且获取元数据信息publicstaticAssemblyassembly=Assembly.GetCallingAssembly();staticvoidMain(string[]args){vartypes=assembly.G......
  • 通过反射访问类中的成员
    1、访问属性a.根据属性名获取Field对象Fieldf=clazz对象.getDeclaredField(属性名);b.暴破:f.setAccessible(true);//f是Fieldc.访问f.set(o,值);//o表示对象d.注意:如果是静态属性,则set和get中的参数o,可以写成null。packagecom.test;classStudent{publicintage;......
  • 反射操作泛型
    1、Java采用泛型擦除的机制来引入泛型。Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换的麻烦。但是,一旦编译完成,所有的和泛型有关的类型将全部擦除。2、为了通过反射操作这些类型以迎合实际开发的需要,Java新增ParameterizedType,GenericArrayType、Type......
  • java通过注解和反射优雅的实现数据脱敏
     数据脱敏是对分为数据库数据脱敏与接口脱敏。其中数据库入库数据脱敏方式我们一般采用对称加密来实现数据脱敏,接口脱敏我们一般用遮罩方式实现数据脱敏比如用“*”占位。本文章主要介绍接口脱敏方式。 1.定义一个自定义注解类importjava.lang.annotation.*;@Target(Elem......
  • Java反射
    原文:https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html Appleapple=newApple();//直接初始化,「正射」apple.setPrice(4);上面这样子进行类对象的初始化,我们可以理解为「正」。而反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用new......
  • Go-使用反射创建并操作结构体
    typeUserstruct{UserIdstringNamestring}funcTestReflectStructPtr(){var(model*Userstreflect.Typeelemreflect.Value}st=reflect.Type(model)//获取结构体指针类*Userst=st.Elem()//使st=......
  • go反射使用及proto协议字段随机动态赋值
    1.基本概念Go语言的反射是一种在运行时动态访问程序元数据的能力。反射可以让我们在运行时检查类型和变量,例如它的大小、方法和动态的值等。这种机制让我们可以编写更加通用的函数和类型,而不需要关心具体的类型。在Go语言中,反射的实现主要依赖于两种类型:Type和Value。这......
  • C-中的编译期反射
    C++的编译期反射我们可以利用__PRETTY_FUNCTION__这个宏获取当前函数的签名。比如以下代码:#include<fmt/core.h>#include<string>template<typenameT>std::stringget_type_name(Tn){return__PRETTY_FUNCTION__;}intmain(intargc,char*argv[]){f......
  • Java中的反射机制
    一、反射简介(一)什么是反射​ Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射......
  • c#反射和特性配合使用案例说明
    在C#中,反射(Reflection)是一个强大的特性,它允许我们在运行时动态地获取和操作类型、成员、方法等信息。以下是一个使用反射的案例,配合特性一起使用,来实现属性验证的功能:假设我们有一个用户类(User),其中包含了一些属性(如姓名、年龄等),我们想要在设置这些属性值的时候进行一些验证......