反射机制_介绍_Class对象获取_动态操作_构造器_方法_属性JAVA211-212

本文主要是介绍反射机制_介绍_Class对象获取_动态操作_构造器_方法_属性JAVA211-212,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来源:http://www.bjsxt.com/
一、S02E211_01反射机制_介绍_Class对象获取

动态语言

反射机制
反射机制

Class类介绍
这里写图片描述

获取Class类的对象
获取Class类的对象

package com.test.reflection;
/*** 测试各种类型(class,interface,enum,annotation,primitive type,void)对应的java.lang.Class对象的获取方式*/
public class Demo {/*** @param args*/public static void main(String[] args) {String path = "com.test.bean.User";try {Class clazz = Class.forName(path);//对象是表示或封装一些数据。一个类被加载后,JVM会创建一个对应该类的Class对象,类的整个结构信息会放到对应的Class对象中。//这个Class对象就像一面镜子一样,通过这面镜子我们可以看到对应类的全部信息。System.out.println(clazz.hashCode());Class clazz2 = Class.forName(path);//一个类只对应一个Class对象System.out.println(clazz2.hashCode());Class strClazz = String.class;//类.classClass strClazz2 = path.getClass();//对象.getClass()System.out.println(strClazz==strClazz2);//trueClass intClazz = int.class;//基本数据类型int[] arr01 = new int[10];int[][] arr02 = new int[30][3];int[] arr03 = new int[30];double[] arr04 = new double[10];System.out.println(arr01.getClass().hashCode());//同类型同维数的数组同对象,arr01和arr02同对象System.out.println(arr02.getClass().hashCode());System.out.println(arr03.getClass().hashCode());System.out.println(arr04.getClass().hashCode());} catch (Exception e) {e.printStackTrace();}}
}
package com.test.bean;public class User {private int id;private int age;private String uname;//javabean必须要有无参的构造方法!public User() {}public User(int id, int age, String uname) {super();this.id = id;this.age = age;this.uname = uname;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getUname() {return uname;}public void setUname(String uname) {this.uname = uname;}
}

控制台输出

24529870
24529870
true
27781119
27179837
27781119
24572920

二、S02E212_01反射机制_动态操作、构造器、方法、属性

反射机制的常见作用
反射机制的常见作用

package com.test.reflection;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*** 应用反射的API,获取类的信息(类的名字、属性、方法、构造器等)*/
public class Demo01 {public static void main(String[] args) {String path = "com.test.bean.User";try {Class clazz = Class.forName(path);//获取类的名字System.out.println(clazz.getName());//获取包名+类名:com.test.bean.UserSystem.out.println(clazz.getSimpleName());//获取类名:User//获取属性信息//Field[] fields = clazz.getFields();//只能获取public的fieldField[] fields = clazz.getDeclaredFields();//获取所有的fieldField f = clazz.getDeclaredField("uname");System.out.println(fields.length);for (Field temp : fields) {System.out.println("属性:" + temp);}//获取方法信息Method[] methods = clazz.getDeclaredMethods();Method m01 = clazz.getDeclaredMethod("getUname",null);//如果方法有参数,则必须传递参数类型对应的class对象Method m02 = clazz.getDeclaredMethod("setUname", String.class);for (Method temp : methods) {System.out.println("方法:" + temp);}//获取构造器信息Constructor[] constructors = clazz.getDeclaredConstructors();//Constructor c = clazz.getDeclaredConstructor(null);Constructor c = clazz.getConstructor(int.class,int.class,String.class);System.out.println("获取构造器:" + c);for (Constructor temp : constructors) {System.out.println("构造器:" + temp);}} catch (Exception e) {e.printStackTrace();}}
}

控制台输出

com.test.bean.User
User
3
属性:private int com.test.bean.User.id
属性:private int com.test.bean.User.age
属性:private java.lang.String com.test.bean.User.uname
方法:public java.lang.String com.test.bean.User.getUname()
方法:public void com.test.bean.User.setUname(java.lang.String)
方法:public void com.test.bean.User.setId(int)
方法:public int com.test.bean.User.getAge()
方法:public void com.test.bean.User.setAge(int)
方法:public int com.test.bean.User.getId()
获取构造器:public com.test.bean.User(int,int,java.lang.String)
构造器:public com.test.bean.User()
构造器:public com.test.bean.User(int,int,java.lang.String)
package com.test.reflection;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;import com.test.bean.User;
/*** 通过反射API动态地操作:构造器、方法、属性*/
public class Demo02 {public static void main(String[] args) {String path = "com.test.bean.User";try {Class<User> clazz = (Class<User>) Class.forName(path);//通过反射API调用构造方法,构造对象User u1 = clazz.newInstance();//其实是调用了User的无参构造方法System.out.println(u1);Constructor<User> c = clazz.getDeclaredConstructor(int.class,int.class,String.class);User u2 = c.newInstance(1001,18,"测试2");System.out.println(u2.getUname());//通过反射API调用普通方法User u3 = clazz.newInstance();Method method = clazz.getDeclaredMethod("setUname", String.class);method.invoke(u3, "测试3");//u3.setUname("测试3");System.out.println(u3.getUname());//通过反射API操作属性User u4 = clazz.newInstance();Field f = clazz.getDeclaredField("uname");f.setAccessible(true);//这个属性不需要安全检查了,可以直接访问f.set(u4, "测试4");//通过反射直接写属性System.out.println(u4.getUname());System.out.println(f.get(u4));//通过反射直接读属性的值} catch (Exception e) {e.printStackTrace();}}
}

控制台输出

com.test.bean.User@1db9742
测试2
测试3
测试4
测试4

这篇关于反射机制_介绍_Class对象获取_动态操作_构造器_方法_属性JAVA211-212的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133243

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数