栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java反射

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java反射

java反射
  • 1.反射的概述
  • 2.反射的使用
  • 3.动态加载类
  • 4.反射的具体实现

1.反射的概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

反射的本质理解,就是获取该类的class对象(类类型 class type)后,反向获取该类对象的各种信息

反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

2.反射的使用
1.1 Object ——> getClass();
1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
1.3 通过Class类的静态方法:forName(String ?className)(常用)

其中1.1是获取Object类中的getClass方法

因为所有类都继承Object类。从而调用Object类来获取
注意:在运行期间,一个类,只有一个Class对象产生。
三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。

3.动态加载类
1、编译时加载类是静态加载类,new 创建对象是静态加载类,在编译时刻就需要加载所有可用使用到的类,如果有一个用不了,那么整个文件都无法通过编译
2、运行时加载类是动态加载类Class c =  Class.forName("类的全名"),不仅表示了类的类型,还表示了动态加载类,编译不会报错,在运行时才会加载,使用接口标准能更方便动态加载类的实现。功能性的类尽量使用动态加载,而不用静态加载。
4.反射的具体实现

下面是一个基本的类 Student

package enity;

public class Student {
	public void test(String a,int b){
		System.out.println("Student.test()-----");
	}
	public void test1(String a,int b,int c){
		System.out.println("Student.test()");
	}
	public void test(int a,int b){
		System.out.println("a+b="+(a+b));
	}
}

得到 Class 的三种方式

package test;

import java.lang.reflect.Method;

import enity.Student;

public class TestClass {
	public static void main(String[] args) throws Exception {
		 Student stu = new Student();
        //stu.test();
		//由三种方式得到Student类的类类型
		//1,由对象的getClass()方法获取类类型
		Class c1 = stu.getClass();
		System.out.println(c1);
		//2,通过类名.class获取,说明每一个类都有一个class的静态属性
		Class c2 = Student.class;
		System.out.println(c1==c2);
		//3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
		Class c3 = Class.forName("enity.Student");
		System.out.println(c3);
		System.out.println(c1==c3);
		
		//通过类的类类型实例化对象
		//Student stu1 = (Student)c1.newInstance();
		//stu1.test();
		//通过反射调用方法
		Method m = c1.getMethod("test");//得到c1类中的test方法,返回的是Method对象
		//调用方法
		m.invoke(stu);//反射调用stu对象中的m方法
	}
}

通过 Class 类获取单个方法

package test;

import java.lang.reflect.Method;

import enity.Student;

public class TestMethod {
	
	public static void getMethods(Object obj){
		//通过obj.getClass()获得该对象的类类型
		Class c = obj.getClass();
		System.out.println("完整的类名:"+c.getName());
		System.out.println("简单的类名:"+c.getSimpleName());
		//通过c得到该对象中所有的方法
		//c.getMethods();//包括从父类继承过来的方法,private不能得到
		Method[] methods = c.getDeclaredMethods();//得到该类中所有的方法,不问访问权限,不能得到父类继承的方法
		for (Method method : methods) {
			String name = method.getName();//得到方法名
			Class c1 = method.getReturnType();//得到方法的返回值类型
			int role = method.getModifiers();//得到方法的访问权限
			Class[] cs = method.getParameterTypes();//得到方法所有的参数,
			System.out.print("方法名:"+role+" "+c1.getSimpleName()+" "+name+"(");
			for (int i=0;i 

希望看完文章后对你能有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/301096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号