zoukankan      html  css  js  c++  java
  • 反射机制(三)

    反射的进一步应用

    通过反射调用类中的方法

    通过Class类中的getMethod方法取得Method对象:

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

    取得Method对象后,通过以下方法调用:

    public Object invoke(Object obj,Object... args) throws IllegalAccessException,IllegalArgumentException,InvocationTargetException

     1 package com.fwj.classdemo;
     2 
     3 public class Person implements IStudent{
     4 
     5     private String name;
     6     private int age;
     7     
     8     public Person(String name, int age) {
     9         super();
    10         this.name = name;
    11         this.age = age;
    12     }
    13 
    14     public Person() {
    15         super();
    16     }
    17 
    18     public Person(String name) {
    19         super();
    20         this.name = name;
    21     }
    22 
    23     //省略getter和setter
    24 
    25     @Override
    26     public String toString() {
    27         return "Person [name=" + name + ", age=" + age + "]";
    28     }
    29 
    30     @Override
    31     public String getInfo() {
    32         // TODO Auto-generated method stub
    33         return AUTHOR + name + age;
    34     }
    35 
    36     @Override
    37     public void sayHello() {
    38         // TODO Auto-generated method stub
    39         System.out.println("hello world!!!");
    40     }
    41     public String say(String str){
    42         
    43         return "say()被调用了,参数:"+str;
    44     }
    45 }
    Person类

    以下代码只是调用Person类中没有参数没有返回值的方法。

     1 package com.fwj.classdemo;
     2 
     3 import java.lang.reflect.Method;
     4 
     5 public class PersonClassDemo {
     6 
     7     public static void main(String[] args) throws Exception{
     8         Class<?> c = null;
     9         c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象
    10         Method m = c.getMethod("sayHello");//参数为方法名
    11         m.invoke(c.newInstance());
    12     }
    13 }

    以下代码调用Person类没有参数有返回值的方法

     1 package com.fwj.classdemo;
     2 
     3 import java.lang.reflect.Method;
     4 
     5 public class PersonClassDemo {
     6 
     7     public static void main(String[] args) throws Exception{
     8         Class<?> c = null;
     9         c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象
    10         Method m = c.getMethod("getInfo");//参数为方法名
    11         String str = (String)m.invoke(c.newInstance());
    12         System.out.println(str);
    13     }
    14 }

    以下代码调用Person类中有参数有返回值的方法

     1 package com.fwj.classdemo;
     2 
     3 import java.lang.reflect.Method;
     4 
     5 public class PersonClassDemo {
     6 
     7     public static void main(String[] args) throws Exception{
     8         Class<?> c = null;
     9         c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象
    10         Method m = c.getMethod("say",String.class);//参数为方法名
    11         String str = (String)m.invoke(c.newInstance(),"有参数有返回值!!!");
    12         System.out.println(str);
    13     }
    14 }

     通过反射调用类中的getter和setter

     1 package com.fwj.classdemo;
     2 
     3 import java.lang.reflect.Method;
     4 
     5 public class PersonClassDemo {
     6 
     7     public static void main(String[] args) throws Exception{
     8         Class<?> c = null;
     9         c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象
    10         Object obj = c.newInstance();
    11         set("name","fwj",obj,String.class);
    12         set("age",23,obj,int.class);
    13         get("name",obj);
    14         get("age",obj);
    15     }
    16     /*
    17      * 
    18      * @param name 属性名
    19      * @param value 属性值
    20      * @param obj 操作的对象
    21      * @param type 参数类型/属性类型
    22      */
    23     public static void set(String name,Object value,Object obj,Class<?> type)throws Exception{
    24         Method m = obj.getClass().getMethod("set"+initStr(name), type);
    25         m.invoke(obj, value);
    26     }
    27     public static void get(String name, Object obj)throws Exception{
    28         Method m = obj.getClass().getMethod("get"+initStr(name));
    29         Object value = m.invoke(obj);
    30         System.out.println(value);
    31     }
    32     public static String initStr(String name){
    33         StringBuffer buf = new StringBuffer();
    34         buf.append(name.substring(0, 1).toUpperCase()).append(name.substring(1));
    35         return buf.toString();
    36     }
    37 }

    通过反射操作属性

     1 package com.fwj.classdemo;
     2 
     3 import java.lang.reflect.Field;
     4 
     5 public class PersonClassDemo {
     6 
     7     public static void main(String[] args) throws Exception{
     8         Class<?> c = null;
     9         c = Class.forName("com.fwj.classdemo.Person");//实例化Class对象
    10         Object obj = c.newInstance();
    11         Field field = c.getDeclaredField("name");//获得属性的Field对象
    12         field.setAccessible(true);//让私有属性可以访问
    13         field.set(obj, "fwj");
    14         System.out.println(field.get(obj));
    15     }
    16 }

    以上代码可以看出属性也可以在代码中设置访问权限。

  • 相关阅读:
    POJ 2942 圆桌骑士 (点双学习笔记)
    洛谷P3563 POI Polarization
    通过集群的方式解决基于MQTT协议的RabbitMQ消息收发
    在WebAPI中调用其他WebAPI
    将WebAPI发布到本地服务器与远程服务器
    利用RabbitMQ、MySQL实现超大用户级别的消息在/离线收发
    C#程序调用cmd.exe执行命令
    C#调用python
    Trixbox下SIP TRUNK的基本设定
    连接两台asterisk服务器
  • 原文地址:https://www.cnblogs.com/mingluosunshan/p/3214105.html
Copyright © 2011-2022 走看看