Java重点:反射机制的使用

这篇具有很好参考价值的文章主要介绍了Java重点:反射机制的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、概念

二、类类

1、类类的获取方式

1)类名.Class

2)对象.getClass()

3)Class.forName()

三、反射实例化

1、调用一个公有的无参构造方法

2、调用一个公有的一个参构造方法

3、调用一个公有的两个参构造方法

4、调用一个私有的一个参构造方法

四、反射:方法调用

1、公有无参

2、公有有参

3、私有有参

完整代码:文章来源地址https://www.toymoban.com/news/detail-729628.html

五、反射:读写属性


一、概念

J2EE中的反射(Reflection)是指在程序运行期间访问、检测和修改自身的状态或行为。通过反射,可以动态地获取一个类的所有成员变量、方法、构造函数等信息,并且可以在运行时调用这些成员。在J2EE中,反射可以方便实现一些框架ORM工具,以及其他动态性要求的应用程序。

什么是反射?

反射(Reflection)是一种在运行时动态地获取和操作对象的能力,它允许程序通过对象的类类型来了解对象的成员和方法,并且可以在运行时调用这些成员和方法。反射可以用于许多目的,例如在运行时动态加载类、实例化对象、查看和修改对象的属性和方法、调用私有方法和构造函数,等等。在Java中,反射通过java.lang.reflect包中的类和接口来实现。反射的优点是可以使我们的代码更加灵活和动态,但是反射的开销比较大,因此在性能要求较高的情况下,应该谨慎使用。

总的来说:反射Java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法

二、类类

在Java反射(reflection)中,Class类被称为“类类”(class of class),因为它代表了JVM中的一个类。每个Java类在内存中都有一个对应的Class类实例对象,可以通过Java的反射机制获取。通过这个实例,我们可以动态地获取创建操作一个类的各种元数据(如属性、方法、注解等),并可以在程序运行时动态地创建、修改该类的对象。通过反射,我们可以实现更加灵活和动态的编程方式,可以在编码阶段不确定访问的类和方法,直到运行时才确定需要获取和调用的类和方法。

1、类类的获取方式

1. Object类中的getClass()方法:可以获取一个对象所属的类。

2. 类名.class:直接通过类名这种语法形式获取一个类的Class实例对象

3. Class.forName(String className):过类的全限定名获取Class实例对象,需要处理ClassNotFoundException异常。

这些方式均可以获得一个Java类的Class实例对象,从而可以利用反射机制获取该类的一系列信息,如属性、方法、构造方法、注解等。

1)类名.Class

在开始示例的前期准备工作我们写一个类(Class)

package com.tgq.reflect;

/**
 * 一个类
 * 
 * @author tgq
 *
 */
public class Student {
	private String sid;

	private String sname;

	public Integer age;

	static {
		System.out.println("加载进jvm中!");
	}

	public Student() {
		super();
		System.out.println("调用无参构造方法创建了一个学生对象");
	}

	public Student(String sid) {
		super();
		this.sid = sid;
		System.out.println("调用带一个参数的构造方法创建了一个学生对象");
	}

	public Student(String sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
		System.out.println("调用带二个参数的构造方法创建了一个学生对象");
	}

	@SuppressWarnings("unused")
	private Student(Integer age) {
		System.out.println("调用Student类私有的构造方法创建一个学生对象");
		this.age = age;
	}

	public String getSid() {
		return sid;
	}

	public void setSid(String sid) {
		this.sid = sid;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public void hello() {
		System.out.println("你好!我是" + this.sname);
	}

	public void hello(String name) {
		System.out.println(name + "你好!我是" + this.sname);
	}

	@SuppressWarnings("unused")
	private Integer add(Integer a, Integer b) {
		return new Integer(a.intValue() + b.intValue());
	}
}

编写好一个类之后我们开始调用方法进行拿去:代码示例

package com.tgq.reflect;

/**
 * 类类的获取方式: 1、类名.Class 2、对象.getClass(); 3、Class.forName();
 * 
 * @author tgq
 *
 */
public class Demo_01 {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws Exception {

		// 1、类名.Class
		Class c1 = Student.class;
		System.out.println(c1);

	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

2)对象.getClass()

package com.tgq.reflect;

/**
 * 类类的获取方式: 1、类名.Class 2、对象.getClass(); 3、Class.forName();
 * 
 * @author tgq
 *
 */
public class Demo_01 {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws Exception {

		// 1、类名.Class
		// Class c1 = Student.class;
		// System.out.println(c1);
		
		// 2、对象.getClass();
		Student student = new Student();
		Class c2 = student.getClass();
		System.out.println(c2);

	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

3)Class.forName()

package com.tgq.reflect;

/**
 * 类类的获取方式: 1、类名.Class 2、对象.getClass(); 3、Class.forName();
 * 
 * @author tgq
 *
 */
public class Demo_01 {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws Exception {

		// 1、类名.Class
		// Class c1 = Student.class;
		// System.out.println(c1);

		// 2、对象.getClass();
		// Student student = new Student();
		// Class c2 = student.getClass();
		// System.out.println(c2);

		// 3、Class.forName();
		Class c3 = Class.forName("com.tgq.reflect.Student");
		System.out.println(c3);
	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

三、反射实例化

在Java中,可以使用反射来实例化一个类。具体实现可以通过Class类的newInstance()方法或者Constructor类的newInstance()方法来实现。

三个常用的方法:getConstructor ()getDeclaredConstructor () ,newInstance()

一切的反射从类类开始

1、调用一个公有的无参构造方法

public class Demo_02 {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws Exception {
		// 一切反射从类类开始
		// 不管是哪一种获取类类的方法都是可以的
		// Class c1 = Class.forName("com.tgq.reflect.Student");
		// Student student = new Student();
		// Class c1 = student.getClass();
		Class c1 = Student.class;
		/*
		 * 1、调用一个无参构造器反射实例化: 如果没有无参构造器是会报错的
		 */
		Student stu1 = (Student) c1.newInstance();
		System.out.println(stu1);


	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

2、调用一个公有的一个参构造方法

public class Demo_02 {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws Exception {
		// 一切反射从类类开始
		// 不管是哪一种获取类类的方法都是可以的
		// Class c1 = Class.forName("com.tgq.reflect.Student");
		// Student student = new Student();
		// Class c1 = student.getClass();
		Class c1 = Student.class;
		/*
		 * 1、调用一个无参构造器反射实例化: 如果没有无参构造器是会报错的
		 */
		Student stu1 = (Student) c1.newInstance();
		System.out.println(stu1);

		/*
		 * 调用有参构造器必须要实例化构造器对象 2、调用一个有一个参数的构造器:getConstructor == 获取构造器对象
		 * 
		 * parameterTypes:代表了参数的类别Class
		 */
		Constructor con1 = c1.getConstructor(String.class);
		Student stu2 = (Student) con1.newInstance("s1");
		System.out.println(stu2);

		

	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

3、调用一个公有的两个参构造方法

public class Demo_02 {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws Exception {
		// 一切反射从类类开始
		// 不管是哪一种获取类类的方法都是可以的
		// Class c1 = Class.forName("com.tgq.reflect.Student");
		// Student student = new Student();
		// Class c1 = student.getClass();
		Class c1 = Student.class;
		/*
		 * 1、调用一个无参构造器反射实例化: 如果没有无参构造器是会报错的
		 */
		Student stu1 = (Student) c1.newInstance();
		System.out.println(stu1);

		/*
		 * 调用有参构造器必须要实例化构造器对象 2、调用一个有一个参数的构造器:getConstructor == 获取构造器对象
		 * 
		 * parameterTypes:代表了参数的类别Class
		 */
		Constructor con1 = c1.getConstructor(String.class);
		Student stu2 = (Student) con1.newInstance("s1");
		System.out.println(stu2);

		/*
		 * 3、调用两个参数的构造器实例化
		 */
		Constructor con2 = c1.getConstructor(String.class, String.class);
		Student stu3 = (Student) con2.newInstance("s1", "sb");
		System.out.println(stu3);

	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

4、调用一个私有的一个参构造方法

public class Demo_02 {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws Exception {
		// 一切反射从类类开始
		// 不管是哪一种获取类类的方法都是可以的
		// Class c1 = Class.forName("com.tgq.reflect.Student");
		// Student student = new Student();
		// Class c1 = student.getClass();
		Class c1 = Student.class;
		/*
		 * 1、调用一个无参构造器反射实例化: 如果没有无参构造器是会报错的
		 */
		Student stu1 = (Student) c1.newInstance();
		System.out.println(stu1);

		/*
		 * 调用有参构造器必须要实例化构造器对象 2、调用一个有一个参数的构造器:getConstructor == 获取构造器对象
		 * 
		 * parameterTypes:代表了参数的类别Class
		 */
		Constructor con1 = c1.getConstructor(String.class);
		Student stu2 = (Student) con1.newInstance("s1");
		System.out.println(stu2);

		/*
		 * 3、调用两个参数的构造器实例化
		 */
		Constructor con2 = c1.getConstructor(String.class, String.class);
		Student stu3 = (Student) con2.newInstance("s1", "sb");
		System.out.println(stu3);

		/*
		 * 4、调用一个私有的带一个参数的构造器实例化: getConstructor只能获取公有的构造器对象
		 *
		 * getDeclaredConstructor:获取私有的构造器对象
		 */
		Constructor con3 = c1.getDeclaredConstructor(Integer.class);
		// 打开私有的访问权限
		con3.setAccessible(true);
		Student stu4 = (Student) con3.newInstance(1);
		System.out.println(stu4);

	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

四、反射:方法调用

1、公有无参

public class Demo_03 {
	public static void main(String[] args) throws Exception {
		Class c = Student.class;
		// 1、反射调用 无参方法
		Student s = (Student) c.newInstance();
		// 反射调用无参方法,先获取到方法对象
		// name:方法名
		// parameterTypes:调用这个方法要传的参数类型
		Method m1 = c.getMethod("hello");
		// invoke:方法的返回值
		// obj:类示例
		// args:参数值
		Object invoke = m1.invoke(s);
		System.out.println(invoke);

		
	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

2、公有有参

public class Demo_03 {
	public static void main(String[] args) throws Exception {
		Class c = Student.class;
		// 1、反射调用 无参方法
		Student s = (Student) c.newInstance();
		// 反射调用无参方法,先获取到方法对象
		// name:方法名
		// parameterTypes:调用这个方法要传的参数类型
		Method m1 = c.getMethod("hello");
		// invoke:方法的返回值
		// obj:类示例
		// args:参数值
		Object invoke = m1.invoke(s);
		System.out.println(invoke);

		// 2、调用有参方法
		Method m2 = c.getMethod("hello", String.class);
		Object invoke2 = m2.invoke(s, "asdfghjk");
		System.out.println(invoke2);

	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

3、私有有参

public class Demo_03 {
	public static void main(String[] args) throws Exception {
		Class c = Student.class;
		// 1、反射调用 无参方法
		Student s = (Student) c.newInstance();
		// 反射调用无参方法,先获取到方法对象
		// name:方法名
		// parameterTypes:调用这个方法要传的参数类型
		Method m1 = c.getMethod("hello");
		// invoke:方法的返回值
		// obj:类示例
		// args:参数值
		Object invoke = m1.invoke(s);
		System.out.println(invoke);

		// 2、调用有参方法
		Method m2 = c.getMethod("hello", String.class);
		Object invoke2 = m2.invoke(s, "asdfghjk");
		System.out.println(invoke2);


		// 3、调用有参私有的方法
		Method m3 = c.getDeclaredMethod("add", Integer.class, Integer.class);
		// 打开私有权限
		m3.setAccessible(true);
		Object invoke3 = m3.invoke(s, 1, 2);
		System.out.println(invoke3);
	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

完整代码:

package com.tgq.reflect;

import java.lang.reflect.Method;

/**
 * 反射动态方法的调用
 * 
 * @author tgq
 *
 */
public class Demo_03 {
	public static void main(String[] args) throws Exception {
		Class c = Student.class;
		// 1、反射调用 无参方法
		Student s = (Student) c.newInstance();
		// 反射调用无参方法,先获取到方法对象
		// name:方法名
		// parameterTypes:调用这个方法要传的参数类型
		Method m1 = c.getMethod("hello");
		// invoke:方法的返回值
		// obj:类示例
		// args:参数值
		Object invoke = m1.invoke(s);
		System.out.println(invoke);

		// 2、调用有参方法
		Method m2 = c.getMethod("hello", String.class);
		Object invoke2 = m2.invoke(s, "asdfghjk");
		System.out.println(invoke2);


		// 3、调用有参私有的方法
		Method m3 = c.getDeclaredMethod("add", Integer.class, Integer.class);
		// 打开私有权限
		m3.setAccessible(true);
		Object invoke3 = m3.invoke(s, 1, 2);
		System.out.println(invoke3);
	}
}

五、反射:读写属性

通过Field类的get()set()方法来实现。

拿到我们所有的属性:


public class Demo_04 {
	public static void main(String[] args) throws Exception {
		Class c = Student.class;

		Student stu = new Student("1", "1A");
		// 我们把age设置一个值
		stu.age = 18;
		// System.out.println(stu.getSid());
		
		// 获取对象中全部的属性
		Field[] fields = c.getDeclaredFields();
		// 遍历
		for (Field f : fields) {
			// 因为sid、sname是私有的,所以我们要打开私有权限
			f.setAccessible(true);
			// 获取所有属性
			System.out.println(f.getName() + ":" + f.get(stu));
		}

	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

我们进行设置属性值:


public class Demo_04 {
	public static void main(String[] args) throws Exception {
		Class c = Student.class;

		Student stu = new Student("1", "1A");
		// 我们把age设置一个值
		stu.age = 18;
		// System.out.println(stu.getSid());

		// 拿到属性
		Field snamefield = c.getDeclaredField("sname");
		// 打开权限
		snamefield.setAccessible(true);
		// 进行设置
		snamefield.set(stu, "2B");
		
		// 获取对象中全部的属性
		Field[] fields = c.getDeclaredFields();
		// 遍历
		for (Field f : fields) {
			// 因为sid、sname是私有的,所以我们要打开私有权限
			f.setAccessible(true);
			// 获取所有属性
			System.out.println(f.getName() + ":" + f.get(stu));
		}

	}
}

输出结果:

java反射调用方法,java,开发语言,jvm,eclipse,java-ee

完整代码:

package com.tgq.reflect;

import java.lang.reflect.Field;

/**
 * 反射:读写属性
 * 
 * @author tgq
 *
 */
public class Demo_04 {
	public static void main(String[] args) throws Exception {
		Class c = Student.class;

		Student stu = new Student("1", "1A");
		// 我们把age设置一个值
		stu.age = 18;
		// System.out.println(stu.getSid());

		// 拿到属性
		Field snamefield = c.getDeclaredField("sname");
		// 打开权限
		snamefield.setAccessible(true);
		// 进行设置
		snamefield.set(stu, "2B");

		// 获取对象中全部的属性
		Field[] fields = c.getDeclaredFields();
		// 遍历
		for (Field f : fields) {
			// 因为sid、sname是私有的,所以我们要打开私有权限
			f.setAccessible(true);
			// 获取所有属性
			System.out.println(f.getName() + ":" + f.get(stu));
		}

	}
}

到了这里,关于Java重点:反射机制的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • java反射的基本使用方法

    当我们使用 Java 开发时,有时需要获取某个类的信息,例如类的属性、方法和构造函数等,然后在程序运行期间动态地操作它们。Java 反射就是用来实现这个目的的一种机制。 Java 反射(Reflection)是 Java 编程语言在运行时动态获取类的信息以及动态调用对象方法的能力。它可

    2024年02月16日
    浏览(12)
  • Java笔记040-反射/反射机制、Class类

    Java笔记040-反射/反射机制、Class类

    目录 反射(reflection) 一个需求引出反射 反射机制 Java反射机制原理图 Java反射机制可以完成 反射相关的主要类 反射机制的优点和缺点 反射调用优化-关闭访问检查 Class类 基本介绍 代码解释部分 类加载方法 应用实例:Class02.java 获取Class类对象 代码解释部分 哪些类型有Class对象

    2024年02月09日
    浏览(11)
  • Java安全基础之Java反射机制和ClassLoader类加载机制

    Java安全基础之Java反射机制和ClassLoader类加载机制

    目录 Java 反射机制 反射 java.lang.Runtime ClassLoader 类加载机制 URLClassLoader loadClass() 与 Class.forName() 的区别? Java 反射(Reflection)是 Java 非常重要的动态特性。在运行状态中,通过 Java 的反射机制,我们能够判断一个对象所属的类。了解任意一个类的所有属性和方法。能够调用任

    2024年04月22日
    浏览(10)
  • Java的反射机制(2)

    目录 Class类基本介绍 Class类的常用方法 如何获取class类对象 哪些类型有Class对象 Class类基本介绍 在Java语言中,每个对象都有一个运行时类,即其所属的类。而这个运行时类在Java中是以Class类的实例形式存在的,该Class类实例就是所谓的Class对象。Class类表示一个类或接口的元

    2024年02月08日
    浏览(8)
  • Java的反射机制

    Java 的反射机制允许在程序运行期间,借助反射 API 获取类的内部信息,并能直接操作对象的内部属性及方法。 Java 反射机制提供的功能: 在运行时,使用反射分析类的能力,获取有关类的一切信息(类所在的包、类实现的接口、标注的注解、类的数据域、类的构造器、类的

    2024年02月02日
    浏览(8)
  • Java反射机制深入详解

    一.概念 反射就是把Java的各种成分映射成相应的Java类。 Class类的构造方法是private,由JVM创建。 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示

    2024年02月06日
    浏览(11)
  • Java反射、代理机制

    官方解释:反射允许对封装类的字段、方法和构造方法的信息进行编程访问。 虚拟机加载类文件后,会在方法区生成一个类对象,包含了类的结构信息,如字段、方法、构造方法等。反射是一种能够在程序运行时动态访问、修改类对象中任意属性的机制(包括private属性)。

    2024年02月10日
    浏览(5)
  • Java反射机制是什么?

    Java反射机制是什么?

    Java 反射机制 是 Java 语言的一个重要特性。 在学习 Java 反射机制前,大家应该先了解两个概念,编译期和运行期。 编译期 是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能,并没有把

    2024年02月12日
    浏览(4)
  • Java学习路线(23)——反射机制

    一、概述 (一)什么是反射: 反射指的是任何一个Class类,在“运行时”都可以直接得到全部成分。 (二)动态可获取的对象: 构造器对象——Constructor,成员变量对象——Field,成员方法对象——Method。 (三)反射关键: 第一步都是得到编译后的Class对象,然后可以获得

    2024年02月08日
    浏览(9)
  • 【JavaSE】Java的反射机制

    1.java反射机制 1.1简介 被视为动态语言的关键,允许程序在执行期间,借助于RefectionAPI取得任何类的内部信息。在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个类对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方

    2024年04月26日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包