反射机制总结归纳

<strong abp="697"><span abp="698" style="font-size:24px;BACKGROUND-COLOR: #ffffff">通过<span abp="699" style="font-size:32px;color:#000099;">反射机制取得</span>类中的公有或私有等的<span abp="700" style="font-size:32px;color:#000099;">构造方法</span>信息、访问公有或私有的<span abp="701" style="font-size:32px;color:#000099;">成员方法</span>以及访问公有或私有的<span abp="702" style="font-size:32px;color:#000099;">成员变量</span>。</span></strong>
<strong abp="704"><span abp="705" style="font-size:24px;"><strong abp="706"><span abp="707" style="font-size:24px;"></span></strong></span></strong> 
<span abp="709" style="BACKGROUND-COLOR: #ffffff"><strong abp="710"><span abp="711" style="font-size:24px;">主</span><span abp="713" style="font-size:24px;">要看第一段代码。</span></strong></span>
<span abp="715" style="BACKGROUND-COLOR: #ffffff"></span> 
package com.fs.po;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {
private void m1() throws Exception {
	/** 得到Stu中的public类型的构造方法<得到公有构造方法> */
	// 通过Stu类的public构造方法创建Stu对象

	Class c = Class.forName("com.fs.po.Stu");// Class.forName("全类名") ===> 得到Class对象的方式二  <推荐使用>
//	Class c = Stu.class;// 类名.class ===> 得到Class对象的方式一
//	Class c = new Stu().getClass();// 对象.getClass() ===> 得到Class对象的方式三  <很少使用,不推荐,知道了解就好>

	// 取得Stu()无参构造方法信息         <体现强转>
	Constructor con1 = c.getConstructor();
	Stu stu1 = (Stu) con1.newInstance();// 调用Stu()创建Stu对象
	stu1.say2();
	System.out.println("==============");

	// 取得public Stu(String name, int age)构造方法信息        <体现泛型>
	Constructor<Stu> con2 = c.getConstructor(String.class,Integer.class);
	Stu stu2 = con2.newInstance("小米",20);// 调用Stu(String name, Integer age)创建对象
	stu2.say2();

//	System.out.println("========此种写法不建议,可读性差=======");
//  取得public Stu(String s, String s2, int age)构造方法信息
//	Stu stu3 = (Stu) Class.forName("com.fs.po.Stu").getConstructor(String.class,String.class ,int.class).newInstance("民大","曉曉",4);
//	stu3.say2();
}

private void m2() throws Exception {
	/** 得到Stu中的private类型的构造方法<私有构造方法,理论上通过new对象是得不到的> */
	//通过Stu类的private构造方法创建Stu对象

	Class c = Class.forName("com.fs.po.Stu");// 封装了Stu的信息

	// 取得private Stu(String name)构造方法信息
	Constructor<Stu> con1 = c.getDeclaredConstructor(String.class);// getDeclaredConstructor()方法不管是公有还是私有的都能取出
	con1.setAccessible(true);// 修改访问权限为可访问
	Stu stu1 = con1.newInstance("小糯米");// 调用Stu()创建Stu对象
	stu1.say2();

	// 通过Stu(String s, String s2, int age)创建Stu对象
	// 取得public Stu(String s, String s2, int age)构造方法信息
			Constructor<Stu> con2 = c.getDeclaredConstructor(String.class, String.class, int.class);
			Stu stu2 = con2.newInstance("ss", "ss", 100);
			stu2.say2();
}

private void m3() throws Exception {
	/** 访问成员变量 */

	Class c = Class.forName("com.fs.po.Stu");

	Constructor<Stu> con = c.getConstructor();// public Stu()
	Stu stu = con.newInstance();

	// 访问公有成员变量public int age信息
//	stu.age = 100;

	// 访问成员变量private String name信息
	Field field = c.getDeclaredField("name");
	field.setAccessible(true);// 设置可访问
	// 访问并修改private String name信息
	field.set(stu, "石头");
	// 取得stu对象中的name的值
	String name = (String) field.get(stu);
	System.out.println("Stu private String name" + name);
}

private void m4() throws Exception {
	/** 访问私有的成员方法 */
	Class c = Class.forName("com.fs.po.Stu");
	Constructor<Stu> con = c.getConstructor();// public Stu()
	Stu stu = con.newInstance();

	// 访问私有成员方法private void say(String name, int age, Teacher t)信息
	Method method1 = c.getDeclaredMethod("say",String.class,int.class,Teacher.class);
	method1.setAccessible(true);
	method1.invoke(stu, "小昭",20,new Teacher());

	// 访问私有成员方法private void say()信息
	Method method2 = c.getDeclaredMethod("say");
//	Method method2 = c.getDeclaredMethod("say", null);
	method2.setAccessible(true);
	method2.invoke(stu);
//	method2.invoke(stu, null);
}

	public static void main(String[] args) throws Exception {
		Test t = new Test();
		t.m4();
	}
}
package com.fs.po;

public class Stu {
	private String name;
	private float hight;
	public int age;
	public Stu() {
		System.out.println("Stu()");
	}
	/***
	 * dfsdfdafasd
	 * @param name
	 * @param age
	 */
	public Stu(String name, Integer age) {
		this.name = name;
		this.age = age;
	}
	public Stu(String s, String s2, int age) {
		System.out.println("Stu(String s, String s2, int age)");
	}
	private Stu(String name) {
		System.out.println("Stu(String name)...");
	}
	private void say(String name, int age, Teacher t)
	{
		System.out.println("上.....");
	}
	private void say()
	{
		System.out.println("下....");
	}
	public void say2() {
		System.out.println("stu say2...."+name);
	}
}
package com.fs.po;

public class Teacher {
	public void teacherSay() {
		System.out.println("good good study");
	}
}

时间: 2024-08-04 20:11:01

反射机制总结归纳的相关文章

巩固java(七)-----java反射机制

一般而言,开发者社群说到动态语言,大致认同的一个定义是:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection.这个字的意思是"反射.映象.倒影",用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以

类库探源-反射机制

导读 1.什么是反射 2.反射的基石--元数据 3.用ildasm.exe 查看元数据 4.System.Reflection 命名空间下需关注的成员 5.获取 Type 实例的方式 6.晚绑定与System.Activator 类 什么是反射 在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.这是Wiki的解释.C#和Java都支持反射,主流的C#和Java框架中都大量应用了反射.反射的主要应用场景如下: 1.使用反射来动态分析来探索

Java反射机制浅析图+应用实例

Java反射机制浅析图+应用实例 --转载请注明出处:coder-pig 本节引言: 其实很久之前就想归纳一下Java中的这个反射机制了,前些天看了慕课网一个讲反射机制的 视频教程觉得不错,又复习了一下,今天面试了一下午,回来就不想写代码了,就写写关于Java 反射的总结,写些简单的使用例子,最后找了2个Android中反射机制应用的例子,分别是 旧版本SDK利用AIDL + Java反射机制接听与挂断电话以及利用反射机制通过按钮关闭 对话框,后续如果用到会另外总结~ 本节正文: 1.反射的相关

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

Java反射机制

Java的反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 反射的作用 1 可以反编译将class文件编译成java文件 2 可以通过反射机制访问Java对象的属性,方法,构造方法等 反射机制使用步骤 1 得到要调用类的class 2 通过得到的c

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

使用反射机制调用属性和私有成员与代理模式的介绍

使用反射机制调用属性: 通过反射机制可以获得类的属性,获得到的属性同样的可以进行赋值.得值操作,调用getField方法并传递属性的名称可以获得[学Java,到凯哥学堂kaige123.com]指定的属性,调用getFields方法则可以获得全部属性,但是这种方式不能获得私有属性: 代码示例: Student类示例: 运行结果: 从运行结果可以看出只拿出了公开的属性,私有的属性拿不到. 使用反射机制调用私有成员: 1.调用私有属性 在反射机制里调用私有属性需要通过getDeclaredField

反射机制

反射机制: 反射机制是能够帮助我们把代码变得更加灵活,可扩展性更高,俗称"软编程.软写法".例如:有一个文件里面有一些值,想要把这些值赋值到一个Student类的属性中,按照以前所学到的知识点,只能是通过文件流将文件里的值读取出来,然后再通过set方法将这些值都赋给Student类的属性.但是,这种方式是将代码写死了,在这之后会有一个问题就是如果文件里的内容发生变动,或者要把这个Student类更换成Dog类的话,就要重新修改代码.程序写好了部署到服务器上运行了,总不能时不时就打开来修