0 0

反射是如何实现的?5

学校的老师,发了一段封装好的用反射创建对象的代码,但是 不 太明白.....
求  详细注释...  非常感谢..


public static Class<?> getFieldType(Object target, String fieldName) {
		String[] fNames = fieldName.split("\\.");
		Class<?> clazz = target.getClass();
		try {
			for (int i = 0; i < fNames.length; i++) {
				Field field = clazz.getDeclaredField(fNames[i]);
				clazz = field.getType();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return clazz;
	}

	public static Object getFieldValue(Object target, String fieldName) {
		Object obj = null;
		String[] fNames = fieldName.split("\\.");
		try {
			for (int i = 0; i < fNames.length; i++) {
				Class<?> clazz = target.getClass();
				Field field = clazz.getDeclaredField(fNames[i]);
				field.setAccessible(true);
				obj = field.get(target);
				target = obj;
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return obj;
	}

	public static void setFieldValue(Object target, String fieldName,
			Object value) {
		String[] fNames = fieldName.split("\\.");
		try {
			Class<?> clazz = target.getClass();
			for (int i = 0; i < fNames.length - 1; i++) {
				Field field = clazz.getDeclaredField(fNames[i]);
				field.setAccessible(true);
				Object obj = field.get(target);
				if (obj == null) {
					obj = field.getType().newInstance();
					field.set(target, obj);
				}
				target = obj;
				clazz = target.getClass();
			}
			Field field = clazz.getDeclaredField(fNames[fNames.length - 1]);
			field.setAccessible(true);
			field.set(target, value);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

 

2014年8月21日 21:38

3个答案 按时间排序 按投票排序

0 0

//获取指定类的指定字段名的Class
public static Class<?> getFieldType(Object target, String fieldName) { 
        String[] fNames = fieldName.split("\\."); //将字段名以分隔符“.”分割
        Class<?> clazz = target.getClass();//获取目标类的Class对象 
        try { 
            for (int i = 0; i < fNames.length; i++) { 
                Field field = clazz.getDeclaredField(fNames[i]); //根据字段名获取Field
                clazz = field.getType(); //获取字段的类型
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return clazz; 
    } 
 
    //获取字段值
    public static Object getFieldValue(Object target, String fieldName) { 
        Object obj = null; 
        String[] fNames = fieldName.split("\\."); 
        try { 
            for (int i = 0; i < fNames.length; i++) { 
                Class<?> clazz = target.getClass(); 
                Field field = clazz.getDeclaredField(fNames[i]); 
                field.setAccessible(true);//解除私有化限制 
                obj = field.get(target);//获取字段值 
                target = obj; 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
            throw new RuntimeException(e); 
        } 
        return obj; 
    } 
 
    //为字段赋值
    public static void setFieldValue(Object target, String fieldName, 
            Object value) { 
        String[] fNames = fieldName.split("\\."); 
        try { 
            Class<?> clazz = target.getClass(); 
            for (int i = 0; i < fNames.length - 1; i++) { 
                Field field = clazz.getDeclaredField(fNames[i]); 
                field.setAccessible(true); 
                Object obj = field.get(target); 
                if (obj == null) { 
                    obj = field.getType().newInstance(); //调用对象的无参数构造方法创建对象
                    field.set(target, obj); 
                } 
                target = obj; 
                clazz = target.getClass(); 
            } 
            Field field = clazz.getDeclaredField(fNames[fNames.length - 1]); 
            field.setAccessible(true);//解除私有化限制 
            field.set(target, value);  //为指定对象的字段赋值
        } catch (Exception e) { 
            e.printStackTrace(); 
            throw new RuntimeException(e); 
        } 
    }

2014年8月22日 15:09
0 0

其实是把object对象进行抽象,认为object本身是某个class,认为class具有属性field,有方法method,然后针对这三者进行一定程度的操作,抛弃了已知类的操作过程,认为class是未知的,需要从object中获取,认为field是未知的,method是未知的,因为是未知,所以需要枚举并匹配,基于名称进行匹配,所以有楼主你贴的代码,取得field的类型和field的值。

2014年8月22日 10:38
0 0

学校的老师,发了一段封装好的用反射创建对象的代码,但是 不 太明白.....
求  详细注释...  非常感谢..


public static Class<?> getFieldType(Object target, String fieldName) {
                //对字段名按.分割
		String[] fNames = fieldName.split("\\.");
                //获得指定对象的类字面常量
		Class<?> clazz = target.getClass();
		try {
			for (int i = 0; i < fNames.length; i++) {
                     //获得指定名称的字段
				Field field = clazz.getDeclaredField(fNames[i]);
                      //获得字段的类型
				clazz = field.getType();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return clazz;
	}

	public static Object getFieldValue(Object target, String fieldName) {
		Object obj = null;
		String[] fNames = fieldName.split("\\.");
		try {
			for (int i = 0; i < fNames.length; i++) {
				Class<?> clazz = target.getClass();
				Field field = clazz.getDeclaredField(fNames[i]);
                                //设置字段安全性,突破private的限制
				field.setAccessible(true);
                                //获得字段的值
				obj = field.get(target);
				target = obj;
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return obj;
	}

	public static void setFieldValue(Object target, String fieldName,
			Object value) {
		String[] fNames = fieldName.split("\\.");
		try {
			Class<?> clazz = target.getClass();
			for (int i = 0; i < fNames.length - 1; i++) {
				Field field = clazz.getDeclaredField(fNames[i]);
                                //设置访问安全性,突破private限制
				field.setAccessible(true);
                                //获得字段的值
				Object obj = field.get(target);
				if (obj == null) {
                                //如果字段值为null,调用字段对应类型的无参构造函数,产生对象值
					obj = field.getType().newInstance();
					field.set(target, obj);
				}
				target = obj;
				clazz = target.getClass();
			}
			Field field = clazz.getDeclaredField(fNames[fNames.length - 1]);
			field.setAccessible(true);
                        //设置对象值
			field.set(target, value);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

2014年8月22日 09:28

相关推荐

    07JVM是如何实现反射的?1

    JVM 反射机制的实现和优化 Java 反射机制是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测、甚至是修改程序的动态行为。Java 反射机制广泛应用于 IDE、调试器、Web 开发框架等领域。 反射机制的...

    C++反射机制实现

    在讨论C++反射机制实现的过程中,我们首先需要明确反射机制的概念和分类。反射的定义源自人工智能领域,它主要涉及到两种反射结构:结构反射和计算反射。结构反射侧重于元类与类之间的关系,计算反射则关注于计算...

    Unity实现镜面反射

    以下我们将详细探讨如何在Unity中实现镜面反射。 首先,镜面反射的核心在于使用特殊的Shader(着色器)。Shader是一种编程语言,用于控制游戏对象在屏幕上显示的颜色和外观。在Unity中,我们通常使用基于Unity ...

    C++反射机制

    尽管C++标准库未直接支持反射机制,但通过精心设计和利用C++的特有特性,如工厂模式、模板元编程和类型特质等,可以有效地实现反射的功能。这种方式不仅增加了代码的灵活性和可扩展性,还使得C++在动态类型处理和...

    反射工厂实现mvc

    希望喜欢, 反射工厂实现mvc

    c++实现反射demo

    然而,目前这一特性尚未被所有编译器广泛支持,所以对于需要在现有环境工作的项目,上述自定义的反射实现仍然有其价值。 总的来说,"C++实现反射demo"展示了如何利用C++的模板和宏技术,模拟出类似于其他语言中的...

    通过类反射机制实现底层数据库连接

    总之,通过类反射机制实现底层数据库连接,是Hibernate等ORM框架实现其功能的关键技术之一。它使我们能够在运行时动态地访问和操作类,极大地提高了代码的灵活性和可扩展性。熟练掌握反射机制,对于理解和应用ORM...

    java反射实现Junit3框架

    在本主题中,我们将深入探讨如何利用Java反射来实现JUnit3框架,即使我们不知道具体的类名。JUnit3是Java单元测试的一个早期版本,它提供了编写和执行测试用例的框架。 首先,理解反射的基本概念是必要的。在Java中...

    Java反射泛型,实现数据库的动态增删改查等功能

    具体实现时,我们可以为每个数据库操作创建一个泛型方法,使用反射获取实体类的字段,根据字段生成对应的SQL语句片段。比如在插入操作中,我们可以遍历`T`的所有字段,构建一个`INSERT INTO table_name (field1, ...

    Qt 反射机制实现,通过类名创建对象

    反射是指程序在运行时动态获取对象属性与...简单一点说,就是可以通过类名称来创建一个类对象,这在Java和Object-C中是原生支持的,所以实现起来非常简单,但是C++就不支持了,如果想要用到反射机制,那就得自己实现。

    利用反射和代理实现简单的Spring

    本篇将详细讲解如何利用反射和代理技术来实现Spring的一些核心功能。 首先,我们要了解什么是反射。反射是Java提供的一种在运行时检查类、接口、字段和方法的能力。通过`java.lang.Class`类和相关的API,我们可以...

    C++实现反射机制

    虽然这些工具不能直接实现反射,但可以用来构建更复杂的元数据系统。`std::any`可以存储任何类型的值,而`std::variant`则限制为一组预定义的类型。 ### 定义元信息 在C++中实现反射,我们需要创建一个元信息系统...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    在使用反射实现AOP动态代理时,我们也需要注意一些问题。例如,由于代理类是在运行时动态创建的,这可能会影响程序的性能,特别是在频繁调用代理方法的情况下。因此,在实际开发中,需要根据应用场景的性能要求和...

    策略模式的实现,通过反射

    本示例将详细介绍如何通过两种方法实现策略模式:一种是通过Map存储方式,另一种是通过配置文件加反射方式。 首先,我们理解策略模式的基本结构。策略模式包含三个主要角色:策略接口(Context)、具体策略类...

    利用反射 实现一个自制的struts

    接下来,让我们探讨如何使用反射来实现Struts的拦截器。拦截器在Struts中扮演着重要的角色,它们在请求处理前后执行额外的任务,比如验证、日志记录或性能监控。在自制的Struts中,你可以创建一个接口,如`...

    通过反射机制实现动态表单

    本篇主要探讨如何利用反射机制实现动态表单,这在处理不确定数据结构或需要动态生成UI的场景中非常有用。 动态表单的实现通常涉及到以下几个关键知识点: 1. **Class类**: Java中的`java.lang.Class`类是每个类的...

    C# 反射原理

    3. 设计模式支持:反射是许多设计模式(如工厂模式、策略模式)实现的基础。 然而,反射也有一些缺点需要注意: 1. 性能开销:反射操作通常比直接调用方法慢,因为它涉及了元数据查找和安全性检查。 2. 安全风险:...

    利用反射实现类的动态加载

    ### 利用反射实现类的动态加载 #### 反射技术简介 反射是Java语言提供的一种强大特性,允许运行时动态地获取类的信息并操纵类的对象。这种能力使得开发人员能够在编写程序时不确定具体类的情况下,依然能实现对类...

Global site tag (gtag.js) - Google Analytics