当前位置:首页 > 学习笔记 > Java教程 > Java教程 反射

Java教程 反射

刘广法2022年03月25日 08:37:22Java教程1450
Java教程 反射-第1张图片-刘广法IT博客

Java教程 反射

在Java中关于放射的相关描述:

1、反射就是通过Java类的各种成分(构造函数、成员属性、成员方法等)映射成一个个的Java对象。

反射相关的使用:

一、通过反射获取Class 类对象:

1、通过getClass(); 进行获取。

2、通过任意的数据类型进行获取Class 类

3、通过forName(String className); 进行获取

通过反射进行获取Class 类对象的实例:

package com.liuguangfa.fanshe;

/**
 * 反射的运用
 * 
 * @author Liu_Xiansheng
 *
 */
public class Student {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	/**
	 * main方法
	 * 
	 * @throws ClassNotFoundException
	 */
	public static void main(String[] args) throws ClassNotFoundException {

		// 通过Object.Class 进行获取类对象
		Class c1 = Student.class;

		// 通过实例化的对象进行获取类对象
		Student student = new Student();
		Class c2 = student.getClass();

		// 通过forName(String className); 进行获取类对象

		Class c3 = Class.forName("com.liuguangfa.fanshe.Student");

		System.out.println(c1 == c2);
		System.out.println(c2 == c3);
	}

}

Java控制台的输出结果为:

true

true

二、通过反射获取构造方法并且使用:

运用相关类:Constructor 类

调用构造函数的方法:newInstance();

获取构造方法:

1、批量获取所有的公有构造函数:

clazz.getConstructors();

2、批量获取所有的公有的、私有的构造函数:

clazz.getDeclaredConstructor();

3、获取公有的构造函数并且调用的方式:

clazz.getConstructor();

调用公有的构造函数的方法:

clazz.getConstructor().newInstance();

4、获取私有的构造函数并且调用的方式:

clazz.getConstructor();

调用私有的构造函数的方法(获取使用权限):

clazz.getConstructor().setAccessible(teue);

clazz.getConstructor().newInstance();


//通过电泳构造函数创建对象时,需要通过调用.getConstructor(); 方法的时候,里面填写构造函数类型,如:

String.class,创建新对象的时候.newInstance(); ,里面填写null,或者时对应的类型。

package com.liuguangfa.fanshe;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 反射的运用
 * 
 * @author Liu_Xiansheng
 *
 */
public class Student {
	private String name;
	private int age;
	private boolean isGood;

	// 创建不同类型的构造器
	public Student() {
		System.out.println("调用的公有、无参数构造器");
	}

	public Student(String name) {
		System.out.println("调用公有 String 类型的name :" + name);
	}

	public Student(int age) {
		System.out.println("调用公有 int 类型的age :" + age);
	}

	public Student(String name, int age) {
		System.out.println("调用公有 Sting 类型的name " + name + ",int 类型的age :" + age);
	}

	private Student(boolean isGood) {
		System.out.println("调用私用 boolean :" + isGood);
	}

	/**
	 * main方法
	 * 
	 * @throws ClassNotFoundException
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException,
			InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		// 创建Class对象
		Class clazz = Class.forName("com.liuguangfa.fanshe.Student");
		// 获取所有公有的构造函数
		System.out.println("***调用所有的公有的构造函数");
		Constructor[] conArrays = clazz.getConstructors();
		for (Constructor e : conArrays) {
			System.out.println(e);
		}
		// 获取所有公有私有默认受保护的构造函数
		System.out.println("***调用公有的、私有的构造函数");
		conArrays = clazz.getDeclaredConstructors();
		for (Constructor e : conArrays) {
			System.out.println(e);
		}
		// 调用公有、无参数的构造器
		System.out.println("***调用公有的、无参的构造函数");
		Constructor con = clazz.getConstructor(null);
		System.out.println(con);

		// 调用公有的、有参数的构造器,这里以String 类型的name,并调用
		System.out.println("***调用公有的、String类型构造函数");
		con = clazz.getConstructor(String.class);
		System.out.println(con);
		// 调用函数
		Object obj = con.newInstance("张三");
		Student stu = (Student) obj;
		System.out.println(stu);

		// 调用私有的构造器,并调用
		System.out.println("***调用私有的造函数");
		con = clazz.getDeclaredConstructor(boolean.class);
		System.out.println(con);
		// 调用函数
		con.setAccessible(true);
		obj = con.newInstance(true);
		stu = (Student) obj;
		System.out.println(stu);
	}

}

Java控制台的输出:

***调用所有的公有的构造函数
public com.liuguangfa.fanshe.Student(java.lang.String,int)
public com.liuguangfa.fanshe.Student(int)
public com.liuguangfa.fanshe.Student(java.lang.String)
public com.liuguangfa.fanshe.Student()
***调用公有的、私有的构造函数
private com.liuguangfa.fanshe.Student(boolean)
public com.liuguangfa.fanshe.Student(java.lang.String,int)
public com.liuguangfa.fanshe.Student(int)
public com.liuguangfa.fanshe.Student(java.lang.String)
public com.liuguangfa.fanshe.Student()
***调用公有的、无参的构造函数
public com.liuguangfa.fanshe.Student()
***调用公有的、String类型构造函数
public com.liuguangfa.fanshe.Student(java.lang.String)
调用公有 String 类型的name :张三
com.liuguangfa.fanshe.Student@72ea2f77
***调用私有的造函数
private com.liuguangfa.fanshe.Student(boolean)
调用私用 boolean :true
com.liuguangfa.fanshe.Student@33c7353a

三、通过反射获取成员变量并调用

获取成员属性的类:Field 类

package com.liuguangfa.fanshe;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/**
 * 反射的运用
 * 
 * @author Liu_Xiansheng
 *
 */
public class Student {
	public String name;
	private int age;

	// 创建不同类型的构造器
	public Student() {
		System.out.println("调用的公有、无参数构造器");
	}

	public Student(String name) {
		System.out.println("调用公有 String 类型的name :" + name);
	}

	public Student(int age) {
		System.out.println("调用公有 int 类型的age :" + age);
	}

	public Student(String name, int age) {
		System.out.println("调用公有 Sting 类型的name " + name + ",int 类型的age :" + age);
	}

	/**
	 * main方法
	 * 
	 * @throws ClassNotFoundException
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	public static void main(String[] args)
			throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException {
		// 创建类对象
		Class clazz = Class.forName("com.liuguangfa.fanshe.Student");

		// 获取公有的成员属性并调用
		Field f = clazz.getField("name");
		// 通过反射创建新的学生实例
		Student stu = (Student) clazz.getConstructor().newInstance();
		// 通过反射赋值给创建的学生
		f.set(stu, "张三");
		System.out.println(stu.name);
		
		// 获取私有的成员属性调用
		f = clazz.getDeclaredField("age");
		f.setAccessible(true);
		f.set(stu, 22);
		System.out.println(stu.age);
		
		//获取所有的公有的成员属性
		System.out.println("获取所有的公有的的成员属性");
		Field [] fArrays =clazz.getFields();
		for(Field i:fArrays) {
			System.out.println(i);
		}
		
		//获取公有的的、私有的成员属性
		System.out.println("获取公有的、私有的成员属性");
		fArrays  = clazz.getDeclaredFields();
		for(Field i :fArrays) {
			System.out.println(i);
		}
	}

}

Java控制台的输出:

调用的公有、无参数构造器
张三
22
获取所有的公有的的成员属性
public java.lang.String com.liuguangfa.fanshe.Student.name
获取公有的、私有的成员属性
public java.lang.String com.liuguangfa.fanshe.Student.name
private int com.liuguangfa.fanshe.Student.age

四、通过反射获取成员方法并调用

获取成员方法的类:Method

package com.liuguangfa.fanshe;

import java.lang.reflect.Method;

/**
 * 反射的运用
 * 
 * @author Liu_Xiansheng
 *
 */
public class Student {
	public String name;
	private int age;

	// 创建公有的方法
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void show1(String s) {
		System.out.println("调用show1方法,其中值为:" + s);
	}

	// 创建私有的方法
	private void show2(int show2Int) {
		System.out.println("调用show21方法,其中值为:" + show2Int);
	}

	/**
	 * main方法
	 * 
	 */
	public static void main(String[] args) throws Exception {
		// 创建类对象
		Class clazz = Class.forName("com.liuguangfa.fanshe.Student");
		// 调用所有公有的方法
		System.out.println("调用所有公有的、私有的方法");
		Method[] methodArrays = clazz.getDeclaredMethods();
		for (Method i : methodArrays) {
			System.out.println(i);
		}

		// 调用所有公有的方法
		System.out.println("调用所有公有的方法");
		methodArrays = clazz.getMethods();
		for (Method i : methodArrays) {
			System.out.println(i);
		}

		// 调用指定的公有方法,并调用
		System.out.println("调用指定的公有方法,并调用");
		Method m = clazz.getMethod("show1", String.class);
		Student stu = (Student) clazz.getConstructor().newInstance();// 创建学生对象
		m.invoke(stu, "刘广法博客你");

		// 调用指定的私有方法,并调用
		System.out.println("调用指定的私有方法,并调用");
		m = clazz.getDeclaredMethod("show2", int.class);
		m.setAccessible(true);// 解除限制
		m.invoke(stu, 22);

	}
}

Java控制台输出:

调用所有公有的、私有的方法
public java.lang.String com.liuguangfa.fanshe.Student.getName()
public void com.liuguangfa.fanshe.Student.setName(java.lang.String)
public int com.liuguangfa.fanshe.Student.getAge()
public void com.liuguangfa.fanshe.Student.show1(java.lang.String)
public void com.liuguangfa.fanshe.Student.setAge(int)
private void com.liuguangfa.fanshe.Student.show2(int)
调用所有公有的方法
public java.lang.String com.liuguangfa.fanshe.Student.getName()
public void com.liuguangfa.fanshe.Student.setName(java.lang.String)
public int com.liuguangfa.fanshe.Student.getAge()
public void com.liuguangfa.fanshe.Student.show1(java.lang.String)
public void com.liuguangfa.fanshe.Student.setAge(int)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
调用指定的公有方法,并调用
调用show1方法,其中值为:刘广法博客你
调用指定的私有方法,并调用
调用show21方法,其中值为:22

文章来源:刘广法,转载请注明出处。原文链接网站为:https://liuguangfa.com/

扫描二维码推送至手机访问。

版权声明:本文由刘广法博客发布,如需转载请注明出处。

本文链接:https://liuguangfa.com/java/154.html

分享给朋友:

“Java教程 反射” 的相关文章

java学习:Java流程控制语句的相关测试题

第一题:将所有包含3的三位数整数相加求和。103 131 133 301类似。public static void main(String[] args) { int n = 100;// 从n开始三位数...

eclipse 修改默认的工作空间以及修改个人工作空间的编码

eclipse 修改默认的工作空间以及修改个人工作空间的编码

一、修改工作空间workspaceFile-->Awitch Workspace-->Other,就打开下面的图,然后选择我标起来的就可以新建工作空间了。二、设置工作空间workspace的编码为UTF-8设置完你所用的工作空间也就是上一步后,需要修改工作空间的编码为UTF-8步骤如下:...

eclipse 如何更换JDK版本 替换自带的JDK版本

eclipse 如何更换JDK版本 替换自带的JDK版本

设置jdk,用安装的JDK替换eclipse自带的JDK(详细步骤)1、Window-->Presferences2、进入后,搜索“java”,找到“Installed JRES”3、删除自带的JDK:选中自带的jdk,然后选择remove。4、添加自己安装的JDK:选中右边的Add,选择St...

Java练习:找出三位数中所有的水仙花的值

找到三位数中所有为水仙花的值1、水仙花:百位数的立方+十位数的地方+个位数的立方等于这个数本身。2、三位数中。具体的步骤:public static void main(String[] args) { int i =&nbs...

Java练习:从控制台输入一个年份,统计输入的年份到现在一共多少天?

从控制台输入一个年份,统计输入的年份到现在一共多少天?注意事项:1、平年365天,闰年十366天。2月份平年28天,2月份闰年29年。2、今年2022年3月14日3、闰年判断:能够被四百整数;能被4整数但不能被100整数public static void main(S...

用Java实现打印各种图形总结篇(矩形、平行四边形、三角形、菱形)

1、用Java实现打印矩形(长方形、正方形): public static void main(String[] args) { for (int y = 0; y < ...

Java练习:百钱百鸡利用Java进行实现

今有100块钱,需要购买100只鸡,已知鸡的价格是:公鸡5元,母鸡3元,小鸡三只元,问:需要购买多少只公鸡、母鸡、小鸡?Java实现百鸡百钱的方法一: public static void main(String[] args) { for&n...

Java练习:打印出所有3位数的素数

课堂练习:打印出所有3位数的素数。素数:只能被1和其本身整除的数 public static void main(String[] args) { // 打印三位数的素数,素数只能被1和本身整数的数。 for (int...

Java教程 第六节:数组

数组数组:简单来说,就是一组相同数据类型的数。float[] score = new float[6];索引或者下标:必须是整数,不能为负。最大下标等于数组长度-1。float[0],就是float类型数据score的第一个项。数组的下标结合循环,可以简化对批...

Java练习:控制台输入十个成绩,编程对这些成绩取平均值,并判断出成绩最大值和成绩最小值

有控制台输入十个成绩,编程对这些成绩取平均值,并判断出成绩最大值和成绩最小值 public static void main(String[] args) { // 有控制台输入十个成绩,编程对这些成绩取平均值,并判断出成绩最大值和成...

Java练习:将数组中的元素首尾调换

数组课堂练习:将数组中的元素首尾调换 public static void main(String[] args) { // 数组课堂练习:将数组中的元素首尾调换 int[] a = { ...

Java练习:定义一共整数数组a,b,两个数组,判断两个数组中的重复的元素以及重复次数

Java课后作业:定义一共整数数组a,b,两个数组,判断两个数组中的重复的元素以及重复次数问题1:判断两个数组中重叠的元素?问题2:重叠的元素都重叠了几次,进行排序输出?本题关键:去重(验证之前是否验证过此数)、排序,(冒泡排序法和选择排序法)、关键字break 和continue 的使用 //&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。