[Java]java反射随笔
类是面向对象的灵魂,一切事物都可以以类来抽象。
在java使用过程中,我们可能会经常用到一个反射的知识,只是别人都封装好的,如jdbc的加载驱动类有一句Class.for(“…jdbc…”).newInstance.当然框架也是离不开了反射,spring能这么方便也不例外。
最新项目中需要再底层库(常用的操作,汇聚的库)用到应用库(在底层库上根据需求新建的库)中的一个类,本来想直接把这个类放到底层库里,一看,需要改动的太大,于是乎就想到了反射。
至于反射,我们不得不提一个一个类那就是Class(不是class),位置为java.lang.Class。这是他的api中一些解释。
闲话少说,针对刚才的问题怎么做呢?
我们要知道需要传进来的类名吧,我们需要类里面的方法吧。 怎么获取呢?
类么,我们可以直接来设置:
Class a = T.class;
怎么获取方法呢,哈哈,忘了刚才的APi了么?
可以获取函数,属性之类等等。
获取函数:
public static Method getMethonName(Class<?> clazz,String methonName,Class<?>[] paramType) throws NoSuchMethodException, SecurityException {Method methon = null;if(paramType == null)methon = clazz.getMethod(methonName,null);methon = clazz.getMethod( methonName, paramType);L.p(methonName);return methon;}
来解释下,如T中有个函数print(String str,int b),获取这个函数呢,可以通过以上函数来传参数:
Class<?> clazz 对应的就是T(记得带着包名)
methon 就是字符”print”,
Class<?>[] paramType就是那个括号里对应的参数java.lang.String和int.class
Method method = getMethonName(a, "print", new Class<?>[] {int.class, String.class });
函数的调用
Method method = getMethonName(a, "print", new Class<?>[] {int.class, String.class });Object o = a.newInstance();method.invoke(o, 1, "helllo");
注意事项
1 没有参数的就直接将paramType置为null
2 静态函数需要 Method method = clazz.getMethod(methodName, pramTypes)
附下使用到的代码:
package com.simple;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import com.cyning.log.L;public class TestReflect {public static void main(String[] args) {Class a = T.class;Method[] methons = a.getMethods();// for(Method m:methons){// L.p(m.getName());// L.p(m.getReturnType().toString());// m.setAccessible(true);// }try {Method method = getMethonName(a, "print", new Class<?>[] {int.class, String.class });Object o = a.newInstance();method.invoke(o, 1, "helllo");} catch (NoSuchMethodException | SecurityException e) {e.printStackTrace();}catch (InstantiationException | IllegalAccessException| IllegalArgumentException | InvocationTargetException e) {e.printStackTrace();}}public static Method getMethonName(Class<?> clazz, String methonName,Class<?>[] paramType) throws NoSuchMethodException,SecurityException {Method methon = null;if (paramType == null)methon = clazz.getMethod(methonName, null);methon = clazz.getMethod(methonName, paramType);L.p(methonName);return methon;}}class T {public void print(int a, String str) {System.out.println(a + str);}
}
转载于:https://www.cnblogs.com/Cyning/p/3434207.html
[Java]java反射随笔相关推荐
- java 防止反射_如何防止JAVA反射对单例类的攻击?
在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...
- 【Java】反射( reflection)机制 详解
目录 1. 定义 2. 用途(了解即可) 3. 反射的基本信息 4. 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.2 Class类中的相关方法(方法的使用方法在后边的示例当中) ...
- java 泛型反射_Java使用反射来获取泛型信息示例
本文实例讲述了Java使用反射来获取泛型信息.分享给大家供大家参考,具体如下: 一 点睛 获得了Field对象后,就可以很容易地获得该Field的数据类型,即使用如下代码即可获得指定Field的类型: ...
- java初反射_初始 java 反射机制 (一)
反射机制详解 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为j ...
- Java中反射的三种常用方式
Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...
- Java的反射机制 工厂模式综合讲解【转载自51CTO】
2019独角兽企业重金招聘Python工程师标准>>> Java的反射机制 工厂模式综合讲解 1.什么叫反射 Java.lang.reflect包下 正常情况下我们可以通过类实例化一 ...
- java反射机制(三)---java的反射和代理实现IOC模式 模拟spring
IOC(Inverse of Control)可翻译为"控制反转",但大多数人都习惯将它称为"依赖注入".在Spring中,通过IOC可以将实现类.参数信息等配 ...
- [Java基础] 反射机制汇总
引言 初学Java反射机制的时候,只是感觉很神奇,但是不知道学了该怎么用,所以过了一段时间就忘得差不多了:最近接触到了框架,在学习中遇到了反射,深深体会到了反射机制的神奇,回来复习了一下反射机制,写一 ...
- Java 利用反射实现C#的委托
一, 观察者模式的缺点 在之前的博文的介绍过观察者模式了. 观察者模式可以让多个观察者同时观察1个被观察者. 也就说被观察者可以1次过执行所有观察者的update()方法. 再通俗d来讲, 就是多个观 ...
- sqlite字段是否存在_学习廖雪峰的JAVA教程---反射(访问字段)
对任意的一个Object实例,只要我们获取了它的Class,就可以获取它的一切信息. 我们先看看如何通过Class实例获取字段信息.Class类提供了以下几个方法来获取字段: Field getFie ...
最新文章
- Servlet(一)
- java getcolormodel_Java ColorModel.getTransparency方法代碼示例
- Facebook Docusaurus 中文文档 自定义页面
- ubuntu python版本切换_ubuntu18.04 python版本切换
- Python教程:自定义排序全套方案
- tensorflow常见函数
- python sftp_python中实现sftp
- cmake学习(二)常用变量和常用环境变量
- Java 排序(转)
- fabric8 java api,kubectl apply -f equivalent in fabric8 java api | 易学教程
- 也来谈一谈js的浅复制和深复制
- java模板导出excel_POI导出excel模板三种方式
- 【eNSP 华为模拟器】了解一下交换机原理和基础命令
- DELPHI 字符转16进制、16进制转字符
- 【软件工程】系统流程图——期末快速复习用
- TypeScript学习总结
- SpringBoot引入第三方SDK以及打包
- RTX3090 GPU环境配置
- Web 前端必会的 PhotoShop 技能
- 如何设置HttpClient请求的Content-Type标头?