0
点赞
收藏
分享

微信扫一扫

使用反射技术操作方法所有细节


1、使用反射技术操作方法所有细节

2、代码演示如下:


package com.reflect.api.method;

import java.lang.reflect.*;

import com.reflect.bean.Cat;

/**
* 使用反射技术操作方法所有细节
* @author tiger
* @Date 2017年8月3日
*/
public class ReflectMethod {
public static void main(String[] args) throws Exception, Exception {
System.out.println("--------------1、获取所有方法------------");
getMethod(Cat.class);
System.out.println("-------2、获取指定方法,并执行此方法 invoke-------");
Cat cat = new Cat();
//有参
Method m = callMethod(Cat.class, "eat",int.class,String.class);
m.invoke(cat, 10,"老鼠");
//无参
Method m2 = callMethod(Cat.class, "eat");
m2.invoke(cat);
System.out.println("--------------3、获取指定方法中细节信息---------");
//有参,有返回值
getMethodInfo(m);
//无参,无返回值
getMethodInfo(m2);
System.out.println("--------------4、利用反射调用类构造器------------");
getConstructor();

}
/**
* 1、获取所有方法
* @param clzz
*/
public static void getMethod(Class
clzz){
//获取所有已经声明的方法,遍历出来
Method[] methods = clzz.getDeclaredMethods();

for (Method method : methods) {
System.out.println(method);
}
}
/**
* 2、获取指定方法,并执行此方法 invoke
* @param clzz
* @param name
* @throws Exception
* @throws NoSuchMethodException
*/
public static Method callMethod(Class
clzz,String mName,Class
...types) throws NoSuchMethodException, Exception{
//传入方法名和类型参数[类型.class](有多少传多少)

Method m = clzz.getDeclaredMethod(mName,types);
//公开权限,以可以操作执行所有方法
m.setAccessible(true);
System.out.println(m);
return m;
}
/**
* 3、获取指定方法中细节信息
* 1、获取类型参数
* 2、返回值
* 3、权限修饰符 1:公有 2:私有 4:protected 0:默认default
* @param m
*/
public static void getMethodInfo(Method m){
//1、获取类型参数
Class
[] types = m.getParameterTypes();
System.out.print("此方法的参数列表:");
for (Class
c : types) {
System.out.print(c+",");
}
System.out.println();

//2、返回值
Class
ret = m.getReturnType();
System.out.println("此方法返回值:"+ret);

//3、权限修饰符
int mod = m.getModifiers();
System.out.println("权限修饰符:"+mod);
}
/**
* 4、利用反射调用类构造器
* @throws Exception
*/
public static void getConstructor() throws Exception{
System.out.println("--获取所有构造器--");
Constructor
[] cons = Cat.class.getDeclaredConstructors();
for (Constructor
c : cons) {
System.out.println(c);
}
System.out.println("--调用了无参构造器--");
Constructor
c = Cat.class.getDeclaredConstructor();
Object object = c.newInstance();
System.out.println(object);
System.out.println("--调用了有参构造器--");
Constructor
c2 = Cat.class.getDeclaredConstructor(String.class);
Object object2 = c2.newInstance("tiger");
System.out.println(object2);
}
}package com.reflect.bean;

public class Cat {

protected String name = "老猫";
public int age = 12;
private Integer score = 100;
public Cat() {
System.out.println("我是无参"+name);
}
public Cat(String name) {
this.name = name;
System.out.println("我是有参"+name);
}

public int eat(int a,String b){
System.out.println("调用有参方法:" + name+"吃了" + a + "只"+ b);
return a;
}

void eat(){
System.out.println("调用无参方法:" +name+"没东西吃了");
}
private int sleep(){
System.out.println("Cat.sleep()");
return 0;
}
@Override
public String toString() {
return "Cat [name=" + name + ", age=" + age + ", score=" + score + "]";
}
}



举报

相关推荐

0 条评论