`
sudalyl
  • 浏览: 101649 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

JAVA反射技术(一)

阅读更多

一、反射的基础---Class

     Class是所有java类的一个总称,就好像各式各样的人都可以用Person来称呼,每一个类被加载之后都会在内存中生存一个Class对象,这个对象我们通常称之为字节码,而我们通过调用一个类创造的对象其实都是字节码搞出来的,一个类只会产生一份字节码。

     那么我们怎么获得一个类的Class呢?有三种方式:

        1.调用某个类的class属性  

        2.使用Class的forName()静态方法  

        3.调用某个对象的getClass()方法。

 

     下面我们通过一个实例来展示下上面两点:

ClassDemo1.java

 

 

package com.lyl.exercise;

public class ClassDemo1 {
	public static void main(String[] args) throws ClassNotFoundException{
		String str="iteye";
		Class cl1=String.class;
		Class cl2=str.getClass();
		Class cl3=Class.forName("java.lang.String");
		System.out.println("str对象与String是同一份字节码吗?"+(cl1==cl2));
		System.out.println("通过Class.forName()获得的字节码与String.class一样吗?"+(cl1==cl3));
	}
}

 

 

     通过查看JDK文档,我们可以发现,Class有许多方法,通过这些方法我们可以得到java类的相关信息,Constructor,Method,Field等,具体的大家可以参考JDK文档。

 

 

二、反射的应用

     那么什么是反射呢?曾经有人说过,反射就是把java类中的各种成分映射成相应的java类。为什么呢?从上一个讲解中大家是否发现,通过Class我们可以解析出一个java类的各种成分,他们返回的也是一个类,所以这句话还是很有道理的。

     下面让我们来看看反射的一些应用:

 

     1.使用反射生成对象

     通过反射来生成对象有两种方式:

        a.使用Class对象的newInstance()方法

        b.使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建Class对              应类的实例。

 

    实例: ClassDemo3.java

 

package com.lyl.exercise;

import java.lang.reflect.Constructor;

public class ClassDemo3 {
	public static void main(String[] args) throws Exception{
		//使用Class对象的newInstance()方法
		String str=(String)Class.forName("java.lang.String").newInstance();
		//使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建Class对应类的实例。
		Constructor constructor=String.class.getConstructor(StringBuffer.class);
		String str2=(String)constructor.newInstance(new StringBuffer("abc"));
	}
}

 

 

     2.成员变量的反射

 

     直接上实例大家看看:

 

ReflectDemo1.java

 

 

package com.lyl.exercise;

import java.lang.reflect.Field;

public class ReflectDemo1 {
	public static void main(String[] args) throws Exception {
		ReflectHelper rh=new ReflectHelper("iteye", "javaeye");
		Field fieldb=rh.getClass().getField("b");
		//fieldb只是类的字段,不是对象的,所以要想获得对象上的值,要使用get()方法
		System.out.println(fieldb.get(rh));
		//如果我们使用上面方法来访问a的值呢?抛出java.lang.NoSuchFieldException
		/*Field fielda=rh.getClass().getField("a");
		System.out.println(fieldb.get(rh));
		因为a是私有成员变量
		*/
		//我们可以通过暴力反射来获取它的值
		Field fielda=rh.getClass().getDeclaredField("a");
		//设置为可以访问
		fielda.setAccessible(true);
		System.out.println(fielda.get(rh));
	}
}

 

 

    ReflectHelper.java

 

package com.lyl.exercise;

public class ReflectHelper {
	private String a;
	public String b;
	public ReflectHelper(String a,String b){
		this.a=a;
		this.b=b;
	}
}

 

    如果将上面的搞懂,那么我们不妨来做一道经典的题目:将一个类中所有String类型的成员变量,其中含有的‘a’替换为‘b’。

    这个题目很明显通过反射可以轻易的完成,大家不妨来看看。

 

package com.lyl.exercise;

import java.lang.reflect.Field;

public class ReflectDemo2 {
	public static void main(String[] args) throws Exception {
		ReflectHelper rh=new ReflectHelper("abc", "basketball");
		changeStringValue(rh);
		System.out.println(rh);
	}

	private static void changeStringValue(Object object) throws Exception{
		Field[] fields=object.getClass().getFields();
		for(Field field:fields){
			if(field.getType()==String.class){
				String oldValue=(String)field.get(object);
				String newValue=oldValue.replace('a','b');
				//将object的String类型的变量替换为newValue
				field.set(object, newValue);
			}
		}
	}
}

 

   这样就搞定了,是不是很简单?

 

                                                                                                                               未完,待续。。。。。。

 

1
1
分享到:

相关推荐

    JDBC_Java反射技术入门

    在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行数据库操作的基础知识,包括连接数据库、执行SQL语句、处理查询结果等。 1. **JDBC基础**: - **加载驱动**:在使用JDBC之前,我们需要...

    java反射技术ppt

    Java反射技术是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象以及它们的方法和属性。通过反射,开发者能够获取关于类的信息,并且能够在运行时动态地创建对象和调用方法,这为编程带来...

    Java反射技术的一般应用

    在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...

    java反射技术源码

    java反射技术应用的很广泛,多看源码,对理解java反射的理解会有很好的认识,这个源码有我自己的理解在里边

    JAVA2 反射技术 pdf

    本文将详细介绍Java反射技术的核心概念及其应用。 #### 核心概念 1. **Class类**:Java反射的基础类是`Class`,每个类都对应一个`Class`实例。可以通过多种方式获取`Class`对象,例如使用类名直接获取(`MyClass....

    Java反射技术浅谈.pdf

    Java反射技术是一种强大的技术,它允许Java程序访问、检测和修改它自己的状态或行为。通过反射,Java程序可以加载一个运行时才知道名称的类,获取其完整的内部信息,并创建其对象,或者对其属性进行设值,或者调用其...

    java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在本“Java反射经典实例”中,我们将深入探讨这个主题,了解如何利用反射来访问和修改私有属性以及...

    java反射技术Demo

    Java反射技术是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至能够动态调用方法和创建对象。这个技术的核心在于`java.lang.reflect`包中的类,如`Class`、`...

    反射实例-JAVA反射机制

    下面通过一个简单的示例来展示Java反射机制的工作流程: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0])...

    Java 反射封装 JavaBean

    使用 Java 反射封装 JavaBean <br> 说明:这个程序在没有使用Hiberante时挺有用的 需要一个数据库查询语句 对应的JavaBean的全名(现在是Class,原来Class.getName()) 返回List包含多个JavaBean

    java反射例子,封装了一个反射帮助类

    Java反射是Java编程语言中的一个重要特性,它允许运行时访问和操作类、接口、字段和方法等信息。在Java中,反射提供了动态类型的能力,使我们可以在程序运行时检查类的信息,创建和调用对象的方法,甚至修改对象的...

    java反射源代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...

    java反射.pdf

    #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用方法、获取类的信息等。 #...

    java反射机制应用

    #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建对象,调用方法等。这为Java...

    JAVA反射机制动态调用 计算器对象的加法,减法函数;JAVA反射机制修改一个学生对象 的私有数据成员

    Java反射机制是Java语言提供的一种强大功能,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个机制在处理不确定类型或者需要灵活操作类的场景中非常有用。在这个...

    java反射机制

    Java的反射机制是Java语言的一...总之,Java反射机制提供了一种强大的工具,使我们能够在运行时检查和操作类和对象,增强了代码的灵活性和可扩展性。然而,由于反射涉及到安全性风险和性能损耗,应谨慎使用,避免滥用。

    JAVA反射详细讲解

    总结,Java反射是Java语言的一个强大特性,它提供了运行时分析和操作类的能力,极大地拓展了Java的灵活性。然而,使用反射也需要谨慎,合理运用才能发挥其优势,避免潜在的问题。理解并熟练掌握反射,对于提升Java...

    Java反射的ppt

    解析Java反射技术讲解如何将字符串变成java中的对象

    基础深化和提高-java反射技术

    Java反射技术的核心在于java.lang.reflect包,它提供了一系列类和接口,用于在运行时获取关于类和对象的信息,并进行相应的操作。主要的类和接口包括Class、Method、Field、Constructor等。 以下是Java反射技术的...

Global site tag (gtag.js) - Google Analytics