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

一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。【这段话摘自百度百科】

java反射有这些功能:

* 在运行时判断一个对象所属的类;

* 在运行时构造任意一个类的对象;

* 在运行时判断任意一个类的成员对象和方法;

* 在运行时调用任意一个类的方法

* 生成动态代理

接下来,将通过一些实例理解java的反射机制。

 根据对象获取其完整的包名和类名

abstract class Base{

}

class BaseExt extends Base{
}

public class Reflection {

	public static void main(String[] args) {

	BaseExt baseExt = new BaseExt();
	//通过对象获得其完整的包名和类名
	System.out.println("baseExt对象的运行时类的java.lang.Class对象:"+baseExt.getClass());
	System.out.println("实例化出对象baseExt的类为:"+baseExt.getClass().getName());
	System.out.println("实例化出对象baseExt的类的超类为:"+baseExt.getClass().getSuperclass().getName());
	System.out.println("实例化出对象baseExt的类的超类的超类为:"+baseExt.getClass().getSuperclass().getSuperclass().getName());

	}

}

运行结果

baseExt对象的运行时类的java.lang.Class对象:class reflection.BaseExt
实例化出对象baseExt的类为:reflection.BaseExt
实例化出对象baseExt的类的超类为:reflection.Base
实例化出对象baseExt的类的超类的超类为:java.lang.Object

归纳:

1.getClass()的作用是返回该对象的运行时类的java.lang.Class对象;

2.getSuperclass()的作用是返回对象的类的父类的java.lang.Class对象;

3.getName()的作用是根据class获取它的包名和路径;

实例化类的对象,获取类的属性和方法,调用类的方法

class Base1{
	public int count;
	public void say(String item){
		System.out.println("我是Base1类,"+item);
	}
	public void tell(){
		System.out.println("我是不会告诉你我是Base1的");
	}
}

class Base2{
	public String name;
	public void say(String item){
		System.out.println("我是Base2类,"+item);
	}
	public void tell(){
		System.out.println("我是不会告诉你我是Base2的");
	}
}

class Info{
    public void getInfo(Object obj){
    	//获取obj对象的类名
	    String className = obj.getClass().getName();
	    try {
	    	//实例化一个类className的对象
			Class<?> base = Class.forName(className);
			//获得该类的所有属性
			Field[] fields = base.getDeclaredFields();
			System.out.println("fields:");
			for(Field field:fields){
				//访问修饰符
				int mo = field.getModifiers();
				String modifier = Modifier.toString(mo);
				//属性类型
				String type = field.getType().getName();
				//属性名
				String name = field.getName();
				System.out.println(" "+modifier + " "+ type + " " +name);
			}
			//获得该类的所有方法
			Method[] methods =  base.getMethods();
			System.out.println("methods:");
			for(Method method:methods){
				//访问修饰符
				int mmo = method.getModifiers();
				String mmodifier = Modifier.toString(mmo);
				//返回类型
				String mtype = method.getReturnType().getName();
				//属性名
				String mname = method.getName();
				System.out.println(" "+mmodifier + " "+ mtype + " " +mname);
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
    }

    public void say(Object obj,String item){
    	//获取obj对象的类名
	    String className = obj.getClass().getName();
	    try{
	    	//实例化一个类className的对象
			Class<?> base = Class.forName(className);
			//调用base对象所属类的say方法
		    Method method = base.getMethod("say",String.class);
		    method.invoke(base.newInstance(),item);
		    //调用base对象所属类的tell方法
		    Method method2 = base.getMethod("tell");
		    method2.invoke(base.newInstance());
	    }catch(Exception e){
	    	e.printStackTrace();
	    }
     }
}

public class Reflection {

	public static void main(String[] args) {
		Info info = new Info();
		info.getInfo(new Base1());
		System.out.println("-------------------------");
		info.getInfo(new Base2());
		System.out.println("-------------------------");
		info.say(new Base1(),"你是谁?");
		System.out.println("-------------------------");
		info.say(new Base2(),"你是谁?");
	}

}

运行结果:

fields:
 public int count
methods:
 public void say
 public void tell
 public final void wait
 public final void wait
 public final native void wait
 public boolean equals
 public java.lang.String toString
 public native int hashCode
 public final native java.lang.Class getClass
 public final native void notify
 public final native void notifyAll
-------------------------
fields:
 public java.lang.String name
methods:
 public void say
 public void tell
 public final void wait
 public final void wait
 public final native void wait
 public boolean equals
 public java.lang.String toString
 public native int hashCode
 public final native java.lang.Class getClass
 public final native void notify
 public final native void notifyAll
-------------------------
我是Base1类,你是谁?
我是不会告诉你我是Base1的
-------------------------
我是Base2类,你是谁?
我是不会告诉你我是Base2的

归纳:

4.Class<?> base = Class.forName(className)  通过调用Class.forName()实例化一个类的对象;

5.getDeclaredFields()获取该类的属性,getMethods()获取该类的方法,getModifiers获取属性和方法的访问修饰符等;

6.通过Info类中say方法的写法调用类的方法,getMethod方法的第一个参数为方法名,后面是参数类型,无参方法只写方法名即可,invoke方法从第二个参数开始为被调用方法的参数

另外通过阅读java API我们还可以获取到其他的一些方法,比如获取构造方法,获取方法参数等等。

好了,反射暂时先写到这里。

时间: 2025-01-05 12:29:22

巩固java(七)-----java反射机制的相关文章

java基础篇---反射机制

一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反射.通过反射,Java可以于运行时加载.探知和使用编译期间完全求和的类.生成其对象实体,调用其方法或者对属性设值.所以Java算是一个半动态的语言吧. 反射的概念: 在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方

黑马程序员——【Java高新技术】——反射机制

---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2.Java反射机制主要提供了以下功能: (1)在运行时,判断任意一个对象所属的类 (2)在运行时,构造任意一个类的对象 (3)在运行时,判断任意一个类所具有的成员变量和方

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

浅说Java中的反射机制(二)

写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量.成员方法.构造方法等,反射可以通过加载类(加载类是个什么东西?一直搞不清楚),解剖出类的各个组成部分. 为什么要用反射? 我们需要访问一个

java基础:反射机制

一:定义 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 二:使用场景 一般用在框架的封装上.hibernate.struts都是用反射机制实现的. 举例:JDBC中加载数据库驱动Class.forName("com.mysql.jdbc.Driver"); 三:优点 反射机制的优点就是可以实现动态创建对象和编译,体现出很大的

关于JAVA中的反射机制的总结

JAVA中的反射机制是一种能够大大增强程序扩展性的技术.当一个程序封装完成后(生成exe文件),如果想要对该程序进行功能扩展,不用进行代码的从新修改(也不可能拿到源码),只要修改配置文件(一般是XML)就可以完成. 这样的程序为外部提供了一个接口,只要按照该接口的规则定义一个对象(功能),即可以为应用程序扩展该功能. 可以这样比喻,你买了一块电脑主板(封装好的程序),此时你想要添加一块声卡(要扩展的功能),此时只能够通过一个pci接口(应用程序提供的接口)来进行扩展.声卡的接口必须符合PCI的规

java 中利用反射机制获取和设置实体类的属性值

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可

Java学习之反射机制

前段时间在做项目的时候,由于是用的纯Servlet基础框架进行开发的,没有用到那些集成的框架,后来在后台处理表单中的数据的时候,感觉有很多东西都是重复的,比较繁琐,例如获取到前台页面表单中的值之后,要在后台实例化一个对象并且调用定义的setter方法来给对象赋值,由于表单中的数据比较多,然后这个调用setter方法的代码就显得有些重复臃肿,后来网上查资料才了解到可以通过java中的反射机制简化这一操作,并且也知道了很多框架里面也都用到了反射... 一.什么是反射机制 JAVA反射机制是在运行状态

java中的反射机制在Android开发中的用处

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.      然而在android中Google很多的类的某些方法不让第三方应用去调用,通过java反射机制能把这些隐藏方法获取出来并调用,三方应用上我们就很方便的去用这些方法.      例如我们需要安全的杀死某个应用的服务和进程调用ActivityManager.forceStopPack