J2EE快速入门之反射

目录

一、什么是反射?

二、如何得到类对象

三、根据类得到类名(全限定名/全路径名)

四、根据类得到类的属性

五、.根据类得到类的方法

六、根据类得到类的构造方法

七、根据类得到类的实现接口列表

八、测试


一、什么是反射?

   反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数

二、如何得到类对象

   一切反射相关的代码都从获得类对象开始
   3种获取方式:
     1)类名.class;
     2) 对象名.getClass();
     3) Class.forName(全限定名/全路径名)

三、根据类得到类名(全限定名/全路径名)

    1)cName.getName();            -->获取全限定名
    2)cName.getSimpleName();         -->获取类名
    3)cName.getPackage();             -->获取包名

public class HelloTest {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {

		// 反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。

		// 传统实例化对象与反射机制实例化对的区别
		// 1)传统方式
		Hello hello = new Hello();
		hello.setName("zs");
		System.out.println(hello.getName());

		// 2)反射方式
		// 产生异常:
		// InstantiationException:反射机制实例化异常
		// IllegalAccessException:没有访问权限异常
		// ClassNotFoundException:类没有发现异常
		/*Class cls = Hello.class;
		Object hello1 = cls.newInstance();
		System.out.println(hello1);*/
		
		// 前提:一切与反射相关的操作都从获取类对象开始!!!(3种)
		// ① 类名.class
		Class cls = Hello.class;

		// ② 对象名.getClass()
		Hello h = new Hello();
		Class cls = h.getClass();
		
		// ③ Class.forName(类的全路径名、全限定名)
		Class cls = Class.forName("com.zking.reflect.entity.Hello");
		
		//打印
		System.out.println("全路径名:"+cls.getName());
		System.out.println("简单类名:"+cls.getSimpleName());
		System.out.println("访问修饰符:"+cls.getModifiers());
		System.out.println("类所在包名:"+cls.getPackage());
		

	}

}

四、根据类得到类的属性

    Field field=cla.getField(“属性名”);

    field.getName();                                -->获取属性名            
    filed.getType();                                  -->获取属性类型        
    field.getModifiers();                          -->获取属性访问修饰符    
    field.set(Object,Object);                   -->设置属性值,参数1:要设置属性所在对象;参数2:要设置的值;    
    field.get(Object);                               -->获取属性值,参数:要获取属性值的对象                
    field.getDeclaredField(“属性名”);    -->获取单个属性(私有、公有、受保护、默认、静态)    
    field.getDeclaredFields();                -->获取所有属性(私有、公有、受保护、默认、静态)

五、.根据类得到类的方法

        //无参无返回、无参有参会、有参无返回、有参有返回
    cla.getMethod();                          -->获取单个公有方法
    cla.getDeclaredMethod();           -->获取当个方法(包括私有、受保护、默认、公有)
    cla.getMethods();                        -->获取所有公有方法
    cla.getDeclaredMethods();         -->获取所有的方法(包括私有、受保护、默认、公有)

六、根据类得到类的构造方法

    cla.getConstrutor();                       -->获取单个公有构造方法
    cla.getDeclaredConstrutor();        -->获取单个构造方法(包括私有、受保护、默认、公有)
    cla.getConstrutors();                     -->获取所有的公有构造方法
    cla.getDeclaredConstrutors();      -->获取所有的构造方法(包括私有、受保护、默认、公有)

七、根据类得到类的实现接口列表

Class[] interface=cla.getInterfaces();    -->获取类对象中所有实现接口列表

八、测试

实体类:

package com.zking.reflect.entity;

/**
 * 学生类
 * @author Administrator
 *
 */
public class Student {
	private String sid;

	private String sname;

	public Integer age;
	
	String sex;

	public Student() {
		super();
		System.out.println("调用无参构造方法创建了一个学生对象");
	}

	public Student(String sid) {
		super();
		this.sid = sid;
		System.out.println("调用带一个参数的构造方法创建了一个学生对象");
	}

	public Student(String sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
		System.out.println("调用带二个参数的构造方法创建了一个学生对象");
	}

	@SuppressWarnings("unused")
	private Student(Integer age) {
		System.out.println("调用Student类私有的构造方法创建一个学生对象");
		this.age = age;
	}

	public String getSid() {
		return sid;
	}

	public void setSid(String sid) {
		this.sid = sid;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public void hello() {
		System.out.println("你好!我是" + this.sname);
	}

	public void hello(String name) {
		System.out.println(name + "你好!我是" + this.sname);
	}

	@SuppressWarnings("unused")
	private Integer add(Integer a, Integer b) {
		return new Integer(a.intValue() + b.intValue());
	}
}

测试类:

public class StudentTest {
	
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
		
		//异常捕捉
		// InstantiationException:反射机制实例化异常
		// IllegalAccessException:没有访问权限异常
		// ClassNotFoundException:类没有发现异常
		// NoSuchFieldException:没有匹配的属性异常
		// NoSuchMethodException:没有匹配的方法异常
		// IllegalArgumentException:元素异常
		
		//获取类对象
		Class cls = Class.forName("com.zking.reflect.entity.Student");
		
		//反射机制实例化对象
		Student stu =(Student) cls.newInstance();
		
		//获取属性(Field)
		//① 获取单个公共的属性
		Field field = cls.getField("age");
		
		//② 获取单个公共的、私有的、受保护的等等属性
		Field field = cls.getDeclaredField("sid");
		
		//③ 获取所有公共的属性
		Field[] fields = cls.getFields();
		
		//④ 获取所有公共的、私有的、受保护的等等属性
    	Field[] fields = cls.getDeclaredFields();
		for (Field field : fields) {
			System.out.println("获取属性名:"+field.getName());
			System.out.println("获取属性访问修饰符:"+field.getModifiers());
			System.out.println("获取属性类型:"+field.getType());
			System.out.println("----------------");
		}
		
		
		//赋值
		Field field = cls.getDeclaredField("sid");
		//设置访问权限
		field.setAccessible(true);
		
		//赋值方法:
		//参数1:实例化对象名
		//参数2:赋值的值
		field.set(stu, "p007");
		
		//取值
		//取值方法:
		//参数:实例化对象名
		Object obj = field.get(stu);
		System.out.println(obj);
		
		//调用方法(Method)
		//方法:有参有返回、有参无返回、无参无返回、无参有返回
		//① 获取单个公共的方法
		Method method = cls.getMethod("hello",null );
		
		//② 获取单个公共的、私有的、受保护的等等方法
		Method method = cls.getDeclaredMethod("hello", String.class);
		
		//③ 获取所有公共的方法
		Method[] methods = cls.getMethods();
		
		//④ 获取所有公共的、私有的、受保护的等等方法
		Method[] methods = cls.getDeclaredMethods();
		
		//打印
		for (Method method : methods) {
			System.out.println("方法名:"+method.getName());
			System.out.println("访问修饰符:"+method.getModifiers());
			System.out.println("方法参数数量:"+method.getParameterCount());
			System.out.println("方法返回类型:"+method.getReturnType());
			System.out.println("----------------");
		}
		
		//调用方法
		Method method = cls.getMethod("hello", String.class);
		Method method = cls.getDeclaredMethod("add", Integer.class,Integer.class);
		//设置访问权限
		method.setAccessible(true);
		//执行方法
		//参数1:实例化对象名
		//参数2:方法参数
		Object returnValue = method.invoke(stu, 20,30);
		System.out.println(returnValue);
			
		//调用构造函数
		Constructor cons = cls.getDeclaredConstructor(Integer.class);
		cons.setAccessible(true);
		cons.newInstance(10);		
	}	
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 基于J2EE快速开发平台Jeecg-Boot,可以帮助开发人员快速地构建和部署企业级应用程序。Jeecg-Boot使用了J2EE开发框架,如Spring Boot、MyBatis等,提供了一套全面的工具和模块,帮助开发人员简化开发过程,提高开发效率。 首先,在使用Jeecg-Boot开发时,我们可以利用其提供的代码生成工具,快速生成大量基础代码。通过定义数据表结构,代码生成工具会自动生成与数据库交互的基础增删改查模块,减少了手动编写这些重复代码的工作量,提高了开发效率。 其次,Jeecg-Boot提供了丰富的业务模块和组件,包括权限管理、菜单管理、数据字典、文件上传下载等等。这些模块和组件可以直接集成到应用程序中,减少了开发人员自行开发这些基础功能的时间和精力,同时保证了应用程序的功能完整性。 此外,Jeecg-Boot还提供了一系列的插件和扩展,可以满足不同开发需求。例如,Jeecg-Boot支持在线开发模式,在不停服的情况下,实时修改代码并生效,极大地提高了调试和修改的效率。同时,Jeecg-Boot也支持分布式部署和集群部署,可以应对高并发和大规模访问的需求。 总之,基于J2EE快速开发平台Jeecg-Boot开发的优势在于提供了一套完整的开发工具和模块,帮助开发人员快速构建和部署企业级应用程序,大大提高了开发效率和质量。 ### 回答2: jeecg-boot是一个基于j2ee快速开发平台,提供了一整套开发工具和框架,使开发者能够快速构建基于j2ee的应用程序。 jeecg-boot具有丰富的功能和特性,包括代码生成器、权限管理、后台管理、前后端分离、多数据源支持等。借助于代码生成器,开发者可以根据数据库表结构自动生成实体类、Dao、Service等代码,节省了手动编写重复代码的时间和工作量。权限管理模块可以帮助开发者实现灵活的用户权限控制,保护系统安全。后台管理模块提供了丰富的功能页面和交互界面,使开发者能够方便地管理系统。前后端分离的特性使得前端开发和后端开发可以独立进行,提高了开发效率。多数据源支持可以满足多数据库连接的需求,适用于复杂的业务场景。 在使用jeecg-boot进行开发时,开发者可以按照自己的需求进行定制和扩展。jeecg-boot提供了丰富的插件和可扩展的接口,使开发者可以灵活地集成自己的业务逻辑和功能。此外,jeecg-boot还提供了详细的文档和示例代码,方便开发者学习和使用。 总之,jeecg-boot是一个强大的基于j2ee快速开发平台,提供了丰富的功能和特性,可以帮助开发者快速构建高质量的j2ee应用程序。无论是开发一个简单的小型应用还是一个复杂的企业级应用,jeecg-boot都是一个优秀的选择。 ### 回答3: jeecg-boot是基于J2EE快速开发平台,它提供了一套简单、高效的开发框架,可以帮助开发人员快速构建企业级应用程序。 首先,jeecg-boot采用了主流的J2EE技术栈,包括Spring Boot、Spring Cloud、Mybatis等,这些技术在企业应用开发中被广泛应用,具有成熟、稳定的特点。通过使用这些技术,开发人员可以快速搭建整体项目架构,减少重复性的工作,提高开发效率。 其次,jeecg-boot提供了丰富的代码生成器和模板,可以根据数据库表结构自动生成代码。这样一来,开发人员只需要定义好数据库表结构,就能够生成对应的实体类、控制器、服务类等代码,省去了大量的手动编写代码的时间和精力。 此外,jeecg-boot还内置了权限管理、数据字典、代码生成、报表打印等常用功能模块,开发人员可以快速集成这些功能,并根据实际需求进行定制。同时,它还支持多数据源配置,能够满足复杂业务场景下的需求。 最后,jeecg-boot具有良好的可扩展性和可维护性。通过遵循一些设计原则和开发规范,开发人员可以编写易于扩展和维护的代码。此外,jeecg-boot还提供了一些常见的工具类和插件,帮助开发人员更好地进行开发工作。 总之,基于jeecg-boot开发可以大大提高开发效率和代码质量,快速构建功能完善、稳定可靠的企业级应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ning_ning_03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值