public Method[] getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
public Method[] getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法。

 public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException  {
Bean bean = new Bean("QQ", 18);
System.out.println(bean); //使用反射
String className = "com.my.test.Bean"; Class<Bean> clas = (Class<Bean>) Class.forName(className); //生成一个实例
Bean b = (Bean)clas.newInstance();
b.setAge(20);
b.setName("WW");
System.out.println(b); //调用方法
clas.getMethod("setName", String.class).invoke(bean, "Jerry");
clas.getMethod("setAge", int.class).invoke(bean, 25);
System.out.println("After reflection....\n" + bean);
}

【转】使用反射动态执行方法例子:

java利用反射动态执行类方法
Person类
public class Person {
String name;
String day;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
public void printlinfo() throws RuntimeException, IOException{
System.out.println(name);
System.out.println(day);
String url="http://www.163.com";
openURL(url); }
public void openURL (String url)throws RuntimeException,IOException{
String urlx=null;
urlx="rundll32 url.dll,FileProtocolHandler "+url; Process p=Runtime.getRuntime().exec(""+urlx); } } 利用反映动态执行类的方法
public static void print(byte[] b1,String tname,String tday) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { MyClassLoade myClassLoader=new MyClassLoade();
Class c = myClassLoader.defineClass("Person", b1);
System.out.println(c.getName());
Object object= c.newInstance();
Field[] fields=c.getDeclaredFields();
System.out.println(fields.length);
String args="java.lang.String";
Method method1= c.getDeclaredMethod("setName", args.getClass()) ;
method1.invoke(object,new Object[] {tname});
Method method2= c.getDeclaredMethod("setDay", args.getClass()) ;
method2.invoke(object,new Object[] {tday});
Method method = c.getDeclaredMethod("printlinfo", null) ;
method.invoke(object); } 参考:利用反射实现JavaBean的自动赋值
import java.lang.reflect.Method;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import com.sns.exception.ApplicationException;
public final class ParameterUtil {
public static void setFormBean(HttpServletRequest request, Object bean) {
Class c = bean.getClass();
Method[] ms = c.getMethods();
for(int i=0; i<ms.length; i++) {
String name = ms.getName();
if(name.startsWith("set")) {
Class[] cc = ms.getParameterTypes();
if(cc.length==1) {
String type = cc[0].getName(); // parameter type
try {
// get property name:
String prop = Character.toLowerCase(name.charAt(3)) + name.substring(4);
// get parameter value:
String param = getString(request, prop);
if(param!=null && !param.equals("")) {
//ms.setAccessible(true);
if(type.equals("java.lang.String")) {
ms.invoke(bean, new Object[] {param});
}
else if(type.equals("int") || type.equals("java.lang.Integer")) {
ms.invoke(bean, new Object[] {new Integer(param)});
}
else if(type.equals("long") || type.equals("java.lang.Long")) {
ms.invoke(bean, new Object[] {new Long(param)});
}
else if(type.equals("boolean") || type.equals("java.lang.Boolean")) {
ms.invoke(bean, new Object[] { Boolean.valueOf(param) });
}
else if(type.equals("java.util.Date")) {
Date date = DateUtil.parseDateTime(param);
if(date!=null)
ms.invoke(bean, new Object[] {date});
}
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
}
每当发现JavaBean中的setXxx()方法时,便自动寻找表单的对应字段xxx,如果找到,就利用反射调用此方法,将对应的字段值赋给JavaBean。
由于表单传递的变量名和值全部是字符串,因此需要做某些转换。目前,该程序能处理的数据类型包括:boolean,Boolean,int,Integer,long,Long,Date,不被支持的数据类型被自动忽略。你也可以很方便地添加新的类型。
请 注意,只有public的set方法能够被调用。如果你希望private或protected的set方法也能被调用,请将红色标识的 getMethods()改为getDeclaredMethods(),以便获得包括private和protected在内的所有方法,并将 ms.setAccessible(true);的注释去掉,以便能正确调用private和protected方法。
反射是Java语言非常强大的功能,但是由于反射会破坏对象封装,并且反射调用的速度较慢,因此,只能在必要的工具类中使用。

反射中getMethods 与 getDeclaredMethods 的区别的更多相关文章

  1. Java反射中getDeclaredField和getField的区别

    getDeclaredField是可以获取一个类的所有字段. getField只能获取类的public 字段. public Field getDeclaredField(String name) t ...

  2. JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别

    JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别   关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来 ...

  3. 反射中Class.forName()和classLoader的区别

    搞清楚两者之间区别前,我们来了解下类加载过程. 一.类加载过程 1.加载 通过一个类的全限定名来获取定义此类的二进制字节流. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 在内存中生 ...

  4. 在Java的反射中,Class.forName和ClassLoader的区别

    前言 最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别.当时没有想出来后来自己研究了一下就写下来记录一下. 解释 在java中Cl ...

  5. [转]JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别

    关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来看看这两者的区别吧: getFields():获得某个类的所有的公共(public)的字段,包括父类 ...

  6. java中Class.getMethods()和Class.getDeclaredMethods()的区别

    在java中,可以根据Class类的对象,知道某个类(接口)的一些属性(成员 ,方法,注释,注解)等.由于最近的工作中用到了这些,其中需要在代码中格局反射知道某些类的方法,查看文档的时候,看到了get ...

  7. java反射中Method类invoke方法的使用方法

    package com.zsw.test; import java.lang.reflect.Method;import java.lang.reflect.InvocationTargetExcep ...

  8. C#中 反射中的Assembly(装载程序集):

    反射中的Assembly(装载程序集):可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息.  String assemblyName = @"NamespaceRef& ...

  9. 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型

    C#反射中的MakeGenericType函数可以用来指定泛型方法和泛型类的具体类型,方法如下面代码所示这里就不多讲了,详情看下面代码一切就清楚了: using System; using Syste ...

随机推荐

  1. XMind快捷键

    XMind 是一款非常实用的思维导图软件,可以画各种结构图鱼骨图.二维图.树形图.逻辑图.组织结构图等!下面是常用的快捷键统计! 快捷鍵(Windows) 快捷鍵(Mac) 描述 Ctrl+N Com ...

  2. SQL 在表中随机取数据

    在一张10万行产品表(Product)中,随机取10条数据的几种方式: SET STATISTICS IO ON SELECT TOP 10 ID FROM dbo.Product(NOLOCK) W ...

  3. .bat脚本基本命令语法

    目录批处理的常见命令(未列举的命令还比较多,请查阅帮助信息)     1.REM 和 ::     2.ECHO 和 @     3.PAUSE     4.ERRORLEVEL     5.TITL ...

  4. Force.com平台基础

    当我开始写这篇博客的时候,<Force.com Platform Fundamentals>的PDF版本我还没看到十分之一.由于PDF全部是英文的,所以我看起来比较吃力.我尝试过边看边做笔 ...

  5. linux修改open files数

    概要 linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够.这就需要修改ulimit和file-m ...

  6. 存储过程之七—java代码调用

    一.简介 jdbc调用存储过程与调用一般的sql语句有些差别.jdbc调用一般的sql语句的时候,返回的是结果集,或是sql语句后是否执行成功的标记量.而存储过程返回的可以是结果集,输出参数.返回状态 ...

  7. hiveserver2 with kerberos authentication

    Kerberos协议: Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-grantin ...

  8. 算法实践——Twitter算法面试题(积水问题)的线性时间解法

    问题描述:在下图里我们有不同高度的挡板.这个图片由一个整数数组所代表,数组中每个数是墙的高度.下图可以表示为数组(2.5.1.2.3.4.7.2).假如开始下雨了,那么挡板之间的水坑能够装多少水(水足 ...

  9. 初始化httpclient的几种方式

    1.CloseableHttpClient httpclient = HttpClients.createDefault(); 2.DefaultHttpClient client = new Def ...

  10. ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法

    ASP.NET MVC中分析淘宝网页发生乱码标题搞定方法 近来正在分析淘宝中商品的信息,效果发生乱码,如: 原因便是中文字符格式发生冲突,ASP.NET MVC 默认采用utf-8,可是淘宝网页采用g ...