列举java语言中反射的常用方法及实例代码
作者:张星烁 发布时间:2022-10-31 13:45:07
Java反射机制
一、什么是反射机制
简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,
那么就可以通过反射机制来获得类的所有信息。
二、哪里用到反射机制
有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,
Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成
驱动对象实例,并不知道它的具体含义。听了反射机制这节课后,才知道,原来这就是反射,现在很多开
框架都用到反射机制,hibernate、struts都是用反射机制实现的。
三、反射机制的优点与缺点
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多
态的应用,有以降低类之间的藕合性。
一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。
它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它
满足我们的要求。这类操作总是慢于只直接执行相同的操作。
列举java语言中反射的常用方法
package review;/*12:43 2019/7/21*/
import model.AnotherClass;
import model.OneClassMore;
import model.SomeClass;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 这个类列举了java语言中关于反射机制的常用的一些方法
* @author zhangxingshuo
*/
public class AboutReflection {
public static void main(String[] args) throws Exception {
}
/*获得Class对象的3种方式*/
private static Class<?> getClazz0(String className) throws ClassNotFoundException {
Class clazz=Class.forName(className);
return clazz;
}
private static Class<?> getClazz1(Object object) {
Class clazz=object.getClass();
return clazz;
}
private static Class<?> getClazz2() {
Class clazz=model.SomeClass.class;
return clazz;
}
/*经常使用的Class对象的3个方法*/
private static String useClazz0(Class clazz) {
String fullyQualifiedName=clazz.getName();
return fullyQualifiedName;
}
private static String useClazz1(Class clazz) {
String className=clazz.getSimpleName();
return className;
} //ex:private //ex:abstract
private static Object useClazz2(Class clazz) throws IllegalAccessException, InstantiationException {
Object object=clazz.newInstance();
return object;
}
/*获得Constructor对象的3个方法*/
private static Constructor<?>[] getConstructorObject0(Class clazz) {
Constructor<?>[] constructors=clazz.getConstructors();
return constructors;
}
private static Constructor<?>[] getConstructorObject1(Class clazz) {
Constructor<?>[] constructors=clazz.getDeclaredConstructors();
return constructors;
}
private static Constructor<?> getConstructorObject2(Class clazz) throws NoSuchMethodException {
Constructor<?> constructor=clazz.getConstructor(SomeClass.class, AnotherClass.class, OneClassMore.class);
return constructor;
}
private static Constructor<?> getConstructorObject3(Class clazz) throws NoSuchMethodException {
Constructor<?> constructor=clazz.getDeclaredConstructor(SomeClass.class, AnotherClass.class, OneClassMore.class);
return constructor;
}
/*经常使用的Constructor对象的2个方法*/
private static Object useConstructorObject0(Constructor<?> constructor) throws IllegalAccessException, InvocationTargetException, InstantiationException {
//under here,if the variable override==true,jvm willl not check the accessible modifier
Object object=constructor.newInstance(new SomeClass(),new AnotherClass(),new OneClassMore());
return object;
}
private static void useConstructorObject1(Constructor<?> constructor) {
//under here changing "override" variable's value who is defined in AccessibleObject,the "super and super" Class of Constructor
constructor.setAccessible(true);
}
/*还有一些*/
private static Class<?> useConstructorObject2(Constructor<?> constructor) {
Class clazz=constructor.getDeclaringClass();
return clazz;
}
private static int useConstructorObject3(Constructor<?> constructor) {
int modifiers=constructor.getModifiers();
return modifiers;
}
private static String useConstructorObject4(Constructor<?> constructor) {
//constructor name is same as the class name
String constructorName = constructor.getName();
//under here getDeclaringClass().getName();
return constructorName;
}
/*获取Field对象的4个方法*/
private static Field[] getFieldObject0(Class clazz){
Field[] fields = clazz.getFields();
return fields;
}
private static Field[] getFieldObject1(Class clazz){
Field[] declaredFields = clazz.getDeclaredFields();
return declaredFields;
}
private static Field getFieldObject2(Class clazz) throws NoSuchFieldException {
Field field = clazz.getField("theFieldName");
return field;
}
private static Field getField3(Class clazz) throws NoSuchFieldException {
Field field = clazz.getDeclaredField("theFieldName");
return field;
}
/*经常使用的Field对象的3个方法*/
private static Object useFieldObject0(Field field,Object object) throws IllegalAccessException {
Object fieldValue = field.get(object);
return fieldValue;
}
private static void useFieldObject1(Field field,Object object) throws IllegalAccessException {
//an object as the field value
field.set(object,new Object());
}
private static void useFieldObject2(Field field){
//same process
field.setAccessible(true);
}
/*还有一些*/
private static int useFieldObject3(Field field){
int modifiers = field.getModifiers();
return modifiers;
}
private static String useFieldObject4(Field field){
String fieldName = field.getName();
return fieldName;
}
/*获取Method对象的4个方法*/
private static Method[] getMethodObject0(Class clazz){
Method[] methods=clazz.getMethods();
return methods;
}
private static Method[] getMethodObject1(Class clazz){
Method[] methods=clazz.getDeclaredMethods();
return methods;
}
private static Method getMethodObject2(Class clazz) throws NoSuchMethodException {
Method method=clazz.getMethod("someMethodName",SomeClass.class,AnotherClass.class,OneClassMore.class);
return method;
}
private static Method getMethodObject3(Class clazz) throws NoSuchMethodException {
Method method=clazz.getDeclaredMethod("someMethodName",SomeClass.class,AnotherClass.class,OneClassMore.class);
return method;
}
/*经常使用的Field对象的2个方法*/
private static Object useMethodObject0(Method method,Object object) throws InvocationTargetException, IllegalAccessException {
Object returnedobject=method.invoke(object,new SomeClass(),new AnotherClass(),new OneClassMore());
return returnedobject;
}
private static void useMethodObject1(Method method){
method.setAccessible(true);
}
/*还有一些*/
private static int useMethodObject2(Method method){
int modifiers = method.getModifiers();
return modifiers;
}
private static String useMethodObject3(Method method){
String methodName = method.getName();
return methodName;
}
/*
tips
通过getMethods(),得到该类或接口独有的和继承自它的所有父类与接口的public方法组成的数组.
通过getDeclaredMethods(),得到该类或接口独有的所有方法,(包括public和非public).
*/
/*just as a empty template for convenience*/
private static void m(){
}
}
总结
以上所述是小编给大家介绍的列举java语言中反射的常用方法及实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
来源:https://www.cnblogs.com/zhang-xing-shuo/archive/2019/07/21/11220850.html


猜你喜欢
- 这个其实很简单,思路是这样的,就是拿view的宽度,除以点的点的宽度+二个点 之间的间距,就可以算出大概能画出几个点
- 目录1.基于注释声明缓存1.1@EnableCaching1.2@Cacheable1.2.1默认key生成规则1.2.2声明自定义key
- 本文实例为大家分享了opencv实现轮廓高斯滤波平滑的具体代码,供大家参考,具体内容如下一个小测试的题目:在图像上点选,找到与点选处相邻的颜
- 本文实例讲述了C#实现自定义Dictionary类。分享给大家供大家参考。具体如下:1.关于MyDictionary类本文中实现的MyDic
- 尝试了各种防止中文乱码的方式,但是还是乱码;最后还是细节问题导致;解决方式:以及俩种方式是百度的,我的问题不是这俩块1.在requestMa
- 本文实例为大家分享了Android实现简单画图画板的具体代码,供大家参考,具体内容如下效果如图:布局文件:<RelativeLayou
- 2PC两阶段提交协议分布式事务通常采用2PC协议,全称Two Phase Commitment Protocol。该协议主要为了解决在分布式
- 在做相机开发时,遇到一个问题,就是需要监听屏幕旋转。最简单的就是使用onConfigurationChanged()和Orientation
- 本文实例为大家分享了C#实现学生档案查询的具体代码,供大家参考,具体内容如下using System;using System.Collec
- 一)URL代理请求 该方式请求有两种代理方式。方式一:使用该方式代理之后,之后的所有接口都会使用代理请求// 对http开启全局代理Syst
- 1、 流的继承关系,以及字节流和字符流。2、 节点流FileOutputStream和FileInputStream和处理流Buffered
- 前言在实际开发中,大多数情况下都需要对 SQL 传入参数以获得想要的结果集,传入的情况分为两种情况:1、SQL语句的拼接,比如表名、like
- 本文实例讲述了Android开发实现SubMenu选项菜单和子菜单。分享给大家供大家参考,具体如下:简介:SubMenu:代表一个子菜单,包
- 一、注解@PostConstruct使用注解@PostConstruct是最常见的一种方式,存在的问题是如果执行的方法耗时过长,会导致项目在
- TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链
- 为什么使用Swagger 在实际开发中我们作为后端总是给前端或者其他系统提供接口,每次写完代码之后不可避
- 在 Android 手机中内置了一款高性能 webkit 内核浏览器, SDK 中封装为一个叫做 WebView 组件。 WebView 类
- 一 介绍本节给知识追寻者给大家带来的是springSecurity入门篇,主要是简述下springSecrurity的启动原理和简单的入门搭
- 有时我们可能会遇到下图这样一种情况 — 我们需要的资料或教程被分成了几部分存放在多个PDF文件中,不管是阅读还是保存都不是很方便,这时我们肯
- 1 pom.xml文件注:热部署功能spring-boot-1.3开始有的<!--添加依赖--><dependency&g