java练习之反射

概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

总而言之,反射就是把java类中的各种成分映射成一个个的Java对象。
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

反射的使用
先写一个类

package demo;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.xml.ws.spi.Invoker;

public class User {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void study(){
        System.out.println("没有参数!");
    }
    public void say(String methodstr,User user) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
        Method method=this.getClass().getDeclaredMethod("say" + methodstr, new Class[]{String.class,int.class});
        method.invoke(this,new Object[]{user.getName(),user.getAge()});
    }
    public void sayhello(String name,int age){
        System.out.println(name+"今年"+age+"岁");
    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public User() {
    }

}

测试

package demo;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class TestDemo {
    public static void main(String[] args) {
        User user=new User("张辉",21);
        //获取Class对象的三种方式
        Class class1=user.getClass();
        Class class2=User.class;
        System.out.println(class1==class2);

        try {
            Class class3=Class.forName("demo.User");
            System.out.println(class2==class3);
            Field fields[]=user.getClass().getDeclaredFields();
            AccessibleObject.setAccessible(fields,true);//修改整个数组的权限
            fields[1].set(user,100);
            fields[0].set(user,"李四");
            user.say("hello",user);
            Method method=user.getClass().getDeclaredMethod("study");
            method.invoke(user);

            for(Field f:fields){
                System.out.println(Modifier.toString(f.getModifiers())+","+f.getName()+","+f.getType());
            }


        } catch (Exception e) {
            e.printStackTrace();
        }


    }

}

运行结果:
true
true
李四今年100岁
没有参数!
private,name,class java.lang.String
private,age,int

你可能感兴趣的:(JAVA)