`

Java学习 之 获取Class对象、使用反射生成并操作对象

阅读更多

1.获取对象

 

  共三个,例子代码如下:

 

  String sring = null;

 

  Class class1 = String.class;// 该方法最为安全可靠,程序性能更高。
  Class class2 = string.getClass();
  Class class3 = Class.forName("java.lang.String");// 可能抛出ClassNotFoundException异常

 

  一旦获取了该类所对应的Class对象之后,就可以通过调用Class对象的方法来获得该对象和该类的真实信息了。

 

2.创建对象 

 

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

(1)使用Class对象的newInstance()方法来创建该Class对象对应类的实例。但是这种方式要求该Class对象的对应类有默认的构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例。

(2)先使用Class对象获取指定的Constructor对象,再调用Construtor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方式可以选择使用某个类的指定构造器来创建实例。

 

  另外,如果我们不想利用默认构造器来创建java对象,而想利用指定的构造器来创建java对象,则需要利用Construtor对象,每个Construtor对应一个构造器,为了利用指定构造器来创建java对象,需要如下三个步骤:

(1)获取该Class对象;

(2)利用该Class对象的getConstrutor方法来获取指定的构造器; 

(3)调用Construtor的newInstance方法来创建Java对象。

 

3.调用方法

 

  获取到某个类的Class对象之后,可以通过该Class对象的getMethods方法或者getMethod方法获取全部或指定方法。

  每个Method对象对应一个方法,获得Method对象后,程序就可通过该Method来调用对应的方法,在Method里包含一个invoke方法,该方法签名如下:

  Object invoke(Object obj,Object... args);该方法中的obj是执行该方法的主调,后面的args是执行该方法时传入该方法的实参。

  当通过Method的invoke方法来调用对应的方法时,Java会要求程序必要要有调用该方法的权限。如果程序确实需要调用该对象的私有方法,则可先调用Method对象的:

  setAccessible(boolean flag);方法,将Method对象的accessoble标志设置为指示的布尔值。

  布尔值为true,则表示该Method在使用时应该取消Java语言访问权限检查;

  布尔值为false,则表示该Method在使用时应该实施Java语言访问权限检查;

 

4.访问属性值

 

  通过Class对象的getFields或getField方法可以获取该类所包括的全部Field(属性)或指定Field,Field提供了如下两组方法来访问属性:

  getXxx(Object obj);获取obj对象该Field的属性值,此处的Xxx对应8个基本类型,如果该属性的类型是引用类型则取消get后面的Xxx。

  setXxx(Object obj,Xxx val);将obj对象的该Field设置成val值,此处的Xxx对应8个基本类型,如果该属性的类型是引用类型则取消set后面的Xxx。

 

示例代码如下:

 

import java.lang.reflect.Field;

class Person{
	
	private String name;
	private int age;
	
	public String toString(){
		return "Person[name:  "+name+",age:  "+age+"]";
	}
	
}

public class FieldTest {

	public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
		// 创建一个Person对象
		Person person = new Person();
		// 获取该Person类的Class实例
		Class<Person> personClass = Person.class;
		// 获取属性名为name的属性
		Field nameField = personClass.getDeclaredField("name");
		// 设置通过反射访问该Field时取消访问权限检查
		nameField.setAccessible(true);
		// 设置新的值
		nameField.set(person, "ChenJianLi");
		
		// 类是
		Field ageField = personClass.getDeclaredField("age");
		ageField.setAccessible(true);
		ageField.setInt(person, 22);
		
		// 打印
		System.out.println(person);
	}
	
}

 

 

 

 

分享到:
评论

相关推荐

    Java常用的反射方法

    反射获取Class类对象的三种方法 2.1 通过全类名的方式获取 2.2 类名.class 2.3 实例对象.getClass() 2.4 总结 3. 反射获取属性变量 3.1 获取所有public修饰符的成员变量 3.2 获取指定字段并赋值 3.3 获取...

    利用JAVA注解与反射 - 实现SQL语句自动生成

    利用JAVA注解实现SQL语句自动生成 编写对应Entity添加相关注解,并通过SqlUtil工具,传入相关参数生成SQL语句 例如:要生成对应数据库Person的SQL增删改查 SqlUtil.create(Person.class) SqlUtil.insert(Person....

    java反射.ppt

    每当一個类被载入时,JVM就自动为其生成一个Class对象,通过操作class对象,我们可以得到该对象的所有成员并操作它们 public class ClassDemo { public static void main(String[] args) { String name = “ACCP"; ...

    Java动态生成代码并编译载入.pdf

    有时候需要在运行时根据模板和数据动态生成 Java 代码,然后对其进行编译生成 Class 文件,然后再将这些类加载 进去,并使用反射来创建对象。

    java用list直接生成Excel文件

    利用jxl包结合java反射机制和注释,直接把list生成对应的Excel文件,即只需传入list、对应生成的对象、标题就可以生成excel文件write(String title, List list,Class c),实现一个简单生成excel工具类

    java 反射Reflection;Class类

    是被视为动态语言的关键,反射机制允许程序在执行期借助Reflection API取得任何类的内部信息并能直接操作任意对象的内部属性及方法。 java反射机制所提供的功能: 生成动态代理 在运行时判断任意一个对象所属的类 在...

    java反射机制原理详解.docx

    我们创建一个类,通过编译,生成对应的.calss文件,之后使用java.exe加载(jvm的类加载器)此.class文件,此.class文件加载到内存以后,就是一个运行时类,存在缓存区,那么这个运行时类的本身就是一个class的实例 ...

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    3.2.4 使用反射机制的步骤 导入Jjava.lang.relfect 包需 遵循以下3三个步骤: 第一步是获得你想操作的类的 java.lang.Class 对象; 第二步是调用诸如 getDeclaredMethods 的方法; 第三步使用 反射API 来...

    候捷谈Java反射机制

    换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program ...

    Java开发技术大全(500个源代码).

    DumpMethods.java 使用反射机制来获取类中的方法 getClassName.java 利用反射机制获取类的名字 invokeConstructor.java 利用反射机制调用构造器 invokeMethod.java 利用反射机制调用成员方法 listConstructors....

    ClassUtil.java

    在使用spring mvc 使用反射自动生成对象 的代码 方便使用

    java反射原理详解

    很好的有百科名片 JAVA反射机制:“程序运行时,允许改变...换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

    java反射机制介绍

    换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods1。这种“看透class”的能力(the ability of the program ...

    Java反射机制的学习

    一篇结合了众多关于Java反射机制...Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其域(甚至是本身声明为private的域或方法)。

    疯狂JAVA讲义

    学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种...

    简单DAO自动生成器、创建器(支持MySQL)Java版 第二版

    一个简单的JAVA版的DAO生成器,通过反射机制获取bean实体类属性,前提是bean属性都有自动生成的getters和setters。 数据库支持MySQL 如果需要使用其他数据库,修改daoCreator.Util.DBUtil 使用方法介绍在test下的...

    Java面向对象系列[v1.0.0][使用反射生成动态代理]

    在Java的java.lang.reflect包里有个Proxy类和一个InvocationHandler接口,通过使用他们可以生成JDK动态代理类或动态代理对象 使用Proxy和InvocationHandler创建动态代理 Proxy提供了用于创建动态代理类和代理对象的...

    java反射配置文件实现

    用反射原理 从配置文件中读取数据 public static void main(String[] args) throws Exception{ Properties pro=new Properties(); pro.load(new FileInputStream("fanshe.txt")); //Class c=null; String ...

    java反射机制

    JAVA反射机制:“程序运行时,允许改变程序结构或变量...换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

    xml与反射.txt

    //获取类的默认构造函数对象并实例化对 象。 第五:得到car对象,然后调用car的方法:Method methd =car.getMethod("setName","String.class");//method声明,并指向car的setName这个方法,得到setName方 法。 2 用...

Global site tag (gtag.js) - Google Analytics