[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 ...
随机推荐
- MEAN Stack:创建RESTful web service
本文在个人博客上的地址为URL,欢迎品尝. 前段时间做了DTREE项目中的前后端数据存储功能,在原有的ngController上进行HTTP请求,后端接受到请求后再存储到mongoDB上.现将学习所得 ...
- 产品经理如何赢得开发人员的尊重和支持?-摘自infoq
对于产品经理来说,赢得开发人员的尊重和支持,从某种意义上讲,是产品迈向成功的坚实一步.最近,知乎社区上的开发人员和管理者在前.后两个帖子中对此展开了激烈的讨论,其中不乏真知灼见. 林志霖Cray认为产 ...
- 将android Settings 源码 导入到 eclipse工程
1. 新建 android 项目 拷贝源码/packages/apps/Settings到你的其它目录. 在eclipse中,新建项目,但是要从exitting source选择: 2. 导入相关的 ...
- 【转】Maven实战(五)---两个war包的调用
原博文出自于: http://blog.csdn.net/liutengteng130/article/details/42879803 感谢! 开篇前提 1.为什么要用两个war包的调用? ...
- boost::bind 和 boost::function 基本用法
这是一篇介绍bind和function用法的文章,起因是近来读陈硕的文章,提到用bind和function替代继承,于是就熟悉了下bind和function的用法,都是一些网上都有的知识,记录一下,期 ...
- 给 TTreeView 添加复选框
//1.引用单元 uses Commctrl ; //2.定义私有过程 procedure tvToggleCheckbox(TreeView: TTreeView;Node: TTreeNode;i ...
- JSF 2 textbox example
In JSF, you can use the <h:inputText /> tag to render a HTML input of type="text", t ...
- [iOS微博项目 - 1.1] - 设置导航栏主题(统一样式)
A.导航栏两侧文字按钮 1.需求: 所有导航栏两侧的文字式按钮统一样式 普通样式:橙色 高亮样式:红色 不可用样式:亮灰 阴影:不使用 字体大小:15 github: https://github ...
- Codeforces Round #250 (Div. 1) D. The Child and Sequence (线段树)
题目链接:http://codeforces.com/problemset/problem/438/D 给你n个数,m个操作,1操作是查询l到r之间的和,2操作是将l到r之间大于等于x的数xor于x, ...
- ManagementFactory (简介)
Java Management Extensions (JMX) is a Java technology that supplies tools for managing and monitorin ...