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

Java教程 反射

刘广法2022年03月25日 08:37:22Java教程2470
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教程 第三节:基本数据类型和运算符

一、算术运算符+:加-:减*:乘/:除%:取余例如:a+b、a-b、a*b、a/b、a%b当两个操作数都为整数时,结果必定为整数。当其中一个操作数为小数时,则为小数除。去余数,通常是一对正正整取余数,事实上,对小数和负数一样取余数。小数(浮点数)在计算机中不是精确存在的,并不是精确存在的。二、比较运...

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

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

eclipse 自动提示功能的实现

eclipse 自动提示功能的实现

之前用的版本都是有提示的,最近安装的最新版没有提示,今天就设置让自动提示出来第一步:windows”->"preferences",弹出preferences设置窗口。第二步:在preferences中找到Java,依次展开列表"Editor"->...

eclipse的快捷键功能

eclipse的快捷键功能

有一些快捷键是可以修改的,具体修改过程如图下:修改快捷的详细步骤:1、使用快捷键调出快捷键列表进行查看:快捷键列表调用:shift + ctrl + L2、window->preferences->general->keys(或直接搜索keys)快捷键列表:shuft + ctrl...

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练习:控制台输入十个成绩,编程对这些成绩取平均值,并判断出成绩最大值和成绩最小值

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

Java教程第七节:选择排序法和和冒泡排序法

选择法排序:分为若干轮比较,每一轮找出一个最大值。刘广法整理思路:假设有数组{ 1, 2, 3, 5, 98, 24, 6, 456, 14 },假设第一个数字最大,然后从第二个开始依次和第一个比,如...

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

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

Java练习:定义一个函数,计算两个整数的最大公约数

Java面试题:定义一个函数,计算两个整数的最大公约数本题关键点:最大的公约数能够被两个数都整除的数 public static void main(String[] args) { // 定义一个函数,计算两个整数的最大公约数...

发表评论

访客

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