[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);
}
}
[Java]java反射随笔的更多相关文章
- JAVA的反射理解
1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...
- java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- iOS运行时编程(Runtime Programming)和Java的反射机制对比
运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java:反射
初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射进阶之总结与详解
一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
- Java中反射的三种常用方式
Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...
随机推荐
- Windwos Server 2008: 当网卡有多个IP地址时,如何指定缺省地址?
这实际是一个当应用向外发起连接时,协议栈对源IP地址的选择问题.如果你的应用没有显式绑定一个本地地址,协议栈会选择一个"最佳"的本地地址来使用. 从 Vista 之后这个选择策略发 ...
- 5个Xcode开发调试技巧
转自Joywii的博客,原文:Four Tips for Debugging in XCode Like a Bro 1.Enable NSZombie Objects(开启僵尸对象) Enab ...
- POJ1179Polygon(DP)
Polygon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4456 Accepted: 1856 Descripti ...
- POJ 3673 Cow Multiplication (水题)
题意:给你两个数,求所有的数位的积的和. 析:太水了,没的说,可以先输入边算,也可以最后再算,一样.. 代码如下: #include <cstdio> #include <strin ...
- SpringMVC(四)
好久没有来谢谢总结性的东西了,一直在赶项目进度,终于忙完了,今天就来说说项目过程中遇到的一些问题: 1.关于在使用@Param的用法,在前面也说过了一点,但是在实际使用中还遇到了一个问题.就是在Map ...
- Unity3D之UGUI学习笔记(三):EventSystem
在UGUI中,EventSystem实现了所有关于交互方面的功能,和NGUI不一样的地方是,我们终于可以摆脱添加Box Collider了! 下面我们来学习一下. 对于按钮来说,直接有onClick的 ...
- Boost的Serialization和SmartPoint搭配使用
准确来说,这篇博文并不是译文,而是一篇某个网页中代码改写而来.原文章中的代码存在几处严重错误,网页又不提供留言功能(不是没有而是一个没有留言功能的留言板).4年过去了,作者对这些错误不更正让人无法接受 ...
- UVa297 Quadtrees
// UVa297 Quadtrees // 题意:给两棵四分树的先序遍历,求二者合并之后(黑色部分合并)黑色像素的个数.p表示中间结点,f表示黑色(full),e表示白色(empty) // 算法: ...
- 创建动态组-以OU为单位
选择“Windows 计算机”为对象,因为监视对象是以计算机为单位 ==================== 以下方式则无组成员返回: 此时要求返回的对象为AD用户或组,猜测SCOM没有监视到该用户或 ...
- 在Flash Builder或者Eclipse统计代码行数的方法
在Flash Builder或者Eclipse统计代码行数的方法如下图菜单栏--搜索--搜索文件