反射(三)

一,通过反射调用类中的方法

在Class类中使用以下的方法取得要调用方法的Method对象:

public Method getMethod(String name,Class<?>...parameterTypes)

取得Method对象之后,通过如下方法进行调用:

public Object invoke(Object obj,Object...args)

二,使用反射调用程序中的set和get方法

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;


interface info
{
 public String getInfo();
 public String say(String name,String content);
 public void sayHello();
}
class Person implements info
{
 private String name;
 private int age;
 public Person(){}
 public Person(String name)
 {
  this.name=name;
 }
 public Person(String name,int age)
 {
   this(name);
   this.age=age;
 }
 public String getInfo() {
  return "Hello";
 }
 public String say(String name, String content) {
  return "world";
 }
 public void sayHello() {
  System.out.println("new Year!");
 }
}
public class ReflectDemo {
 public static void main(String args[]) throws Exception
 {
  Class<?> c=Class.forName("Person");
  //调用类中无参,没有返回值的方法
  Method met=c.getMethod("sayHello");
     //执行方法
  met.invoke(c.newInstance());
  
  //调用有返回值的方法
  Method me=c.getMethod("getInfo");
     String val=(String)met.invoke(c.newInstance());
     System.out.println(val);
 
     //调用有返回值,有参数的方法
//     Method m=c.getMethod("say", String.class,String.class);
//     String val1=(String)m.invoke(c.newInstance(),"jin","zq");
//     System.out.println(val1);
     Object o=c.newInstance();
     set("name","jin",o,String.class);
     get("name",o,String.class);
 } 
    /*
     *
     * @param name 属性名称
     * @param value 属性值
     * @param obj 要操作的对象     *
     * */
 public static void set(String name,String value,Object obj,Class<?> type) throws Exception
    {
  Method met=obj.getClass().getMethod("set"+initStr(name),type);
  met.invoke(obj, value);
  System.out.println(initStr(name));
    }
 public static void get(String name,Object obj) throws Exception
 {
  Method met=obj.getClass().getMethod("get"+initStr(name));
  Object value=met.invoke(obj);
  System.out.println(value);
 }
 public static String initStr(String name)
 {
  StringBuffer buf=new StringBuffer();
  buf.append(name.substring(0,1).toUpperCase()).append(name.substring(1));
     return buf.toString();
 }
}

三,通过反射直接操作属性

import java.lang.reflect.Field;
public class InvokeFieldDemo {

 public static void main(String args[]) throws Exception
 {
  Class<?> c=Class.forName("Person");
  Object obj=c.newInstance();
  Field nameField=c.getDeclaredField("name");
  nameField.setAccessible(true);//让属性可见
  nameField.set(obj,"jin");
  System.out.println(nameField.get(obj));
 }
}

属性也是可以通过代码设置访问权限的。

原文地址:https://www.cnblogs.com/jinzhengquan/p/1948886.html