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

在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. mac搭建PHP开发环境

    在Mac系统上搭建Php服务器环境: LAMP: Linux Apache MySQL PHP MAMP: MACOS APACHE(自带) MYSQL(需自己安装) PHP(自带) 一.APACHE ...

  2. jackson 注解的使用

    在实体对象上添加 @JsonAutoDetect , 表明对该实体对象序列化成json串. @JsonAutoDetect public class User{ private int id; pri ...

  3. 【转】Nginx系列(三)--管理进程、多工作进程设计

    原博文出于:http://blog.csdn.net/liutengteng130/article/details/46700999  感谢! Nginx由一个master进程和多个worker进程组 ...

  4. 现代程序设计 homework-05

    本次作业要求设计服务器和客户端,由于之前对网络编程是一窍不通,上上节课听宗学长讲述Tcp的时候心里想这个东西还真是高大上啊一点儿都听不懂,但是上个周末看了看C#网络编程的博客和书之后,发现这个东西入门 ...

  5. Cygwin的包管理器:apt-cyg

    参考<Cygwin的包管理器:apt-cyg> cygwin下安装每次需要启动set_up,比较蛋疼,还是debian的apt方便,在网上看到应该cygwin 下的apt,觉得不错. 从h ...

  6. Red5下的room

    http://blog.csdn.net/whycold/article/details/6142475 package com.test; import java.util.ArrayList;im ...

  7. Java IO (5) - 总结

    Java IO (5) - 总结 0. 目录 FileInputStream FileOutputStream FileReader FileWriter BufferedReader Buffere ...

  8. VC中监测程序运行时间(二)-毫秒级

    /* * 微秒级计时器,用来统计程序运行时间 * http://blog.csdn.net/hoya5121/article/details/3778487#comments * //整理 [10/1 ...

  9. 本地搜索神器-Everything

    现在硬盘越来越大了,经常机器上一堆资料,要找的时候,无论是XP还是Win7,都要搜索半天. 如果使用Everything,可以大大的加快这个过程. 具体的评价请看http://www.appinn.c ...

  10. windows 下实现函数打桩:拦截API方式

    windows 下实现函数打桩:拦截API方式            近期由于工作须要,開始研究函数打桩的方法. 由于不想对project做过多的改动,于是放弃了使用Google gmock的想法. ...