类是面向对象的灵魂,一切事物都可以以类来抽象。

在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反射随笔的更多相关文章

  1. JAVA的反射理解

    1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...

  2. java的反射

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  3. iOS运行时编程(Runtime Programming)和Java的反射机制对比

    运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下:   1.相同点   都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...

  4. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  5. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  6. Java:反射

    初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...

  7. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  8. java笔记--反射进阶之总结与详解

    一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...

  9. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  10. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

随机推荐

  1. Windwos Server 2008: 当网卡有多个IP地址时,如何指定缺省地址?

    这实际是一个当应用向外发起连接时,协议栈对源IP地址的选择问题.如果你的应用没有显式绑定一个本地地址,协议栈会选择一个"最佳"的本地地址来使用. 从 Vista 之后这个选择策略发 ...

  2. 5个Xcode开发调试技巧

    转自Joywii的博客,原文:Four Tips for Debugging in XCode Like a Bro    1.Enable NSZombie Objects(开启僵尸对象) Enab ...

  3. POJ1179Polygon(DP)

    Polygon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4456   Accepted: 1856 Descripti ...

  4. POJ 3673 Cow Multiplication (水题)

    题意:给你两个数,求所有的数位的积的和. 析:太水了,没的说,可以先输入边算,也可以最后再算,一样.. 代码如下: #include <cstdio> #include <strin ...

  5. SpringMVC(四)

    好久没有来谢谢总结性的东西了,一直在赶项目进度,终于忙完了,今天就来说说项目过程中遇到的一些问题: 1.关于在使用@Param的用法,在前面也说过了一点,但是在实际使用中还遇到了一个问题.就是在Map ...

  6. Unity3D之UGUI学习笔记(三):EventSystem

    在UGUI中,EventSystem实现了所有关于交互方面的功能,和NGUI不一样的地方是,我们终于可以摆脱添加Box Collider了! 下面我们来学习一下. 对于按钮来说,直接有onClick的 ...

  7. Boost的Serialization和SmartPoint搭配使用

    准确来说,这篇博文并不是译文,而是一篇某个网页中代码改写而来.原文章中的代码存在几处严重错误,网页又不提供留言功能(不是没有而是一个没有留言功能的留言板).4年过去了,作者对这些错误不更正让人无法接受 ...

  8. UVa297 Quadtrees

    // UVa297 Quadtrees // 题意:给两棵四分树的先序遍历,求二者合并之后(黑色部分合并)黑色像素的个数.p表示中间结点,f表示黑色(full),e表示白色(empty) // 算法: ...

  9. 创建动态组-以OU为单位

    选择“Windows 计算机”为对象,因为监视对象是以计算机为单位 ==================== 以下方式则无组成员返回: 此时要求返回的对象为AD用户或组,猜测SCOM没有监视到该用户或 ...

  10. 在Flash Builder或者Eclipse统计代码行数的方法

    在Flash  Builder或者Eclipse统计代码行数的方法如下图菜单栏--搜索--搜索文件