灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2604回复:0

Java反射机制-学习笔记1

楼主#
更多 发布于:2012-09-08 09:44

java 中,定义一个Class,然后就可以通过new 关键字,将Class 实例化,从而得到一个实例对象;


那么反射,刚好相反,是通过一个Class的实例对象,来得到Class 类的相关信息.




实例1: 通过一个实例对象,获得完整的包名和类名


[java]
package org.zhang.test;

class Demo{

}
public class ReflectTest {
    public static void main(String[] args) {
        Demo demo = new Demo();
        System.out.println(demo.getClass().getName());
    }
}
运行结果:org.zhang.test.Demo


实例2:所有类的对象都是Class 的实例


[java]
package org.zhang.test;

class Demo {

}

public class ReflectTest {
    public static void main(String[] args){
        Class<?> c1 = null;
        Class<?> c2 = null;
        Class<?> c3 = null;
        try {
            c1 = Class.forName("org.zhang.test.Demo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        c2 = (new Demo()).getClass();
        c3 = Demo.class;

        assert c1 != null;
        System.out.println(c1.getName());
        System.out.println(c2.getName());
        System.out.println(c3.getName());
    }
}


结果:
org.zhang.test.Demo
org.zhang.test.Demo
org.zhang.test.Demo
其中:Class<?> 等同于 Class。    定义泛型的时候,如:class User<T> {  }




实例3: 通过Class,实例化 类的对象


[java]
package org.zhang.test;
class Person{
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + 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 class ReflectTest {
    public static void main(String[] args){
        Class<?> personClass = null;
        Person person = null;
        try {
            personClass = Class.forName("org.zhang.test.Person");
            person = (Person) personClass.newInstance();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (InstantiationException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (IllegalAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

        assert person != null;
        person.setName("zhangwenan");
        person.setAge(25);
        System.out.println(person);

    }
}


结果:
Person{name='zhangwenan', age=25}


实例4:通过Class 调用不同的构造方法


[java]
package org.zhang.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

class Person{
    private String name = "no name";
    private int age = 0;

    public Person(String name) {
        this.name = name;
    }

    public Person(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }


    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + 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 class ReflectTest {
    public static void main(String[] args){
        Class<?> personClass = null;
        Person person1 = null;
        Person person2 = null;
        Person person3 = null;
        Person person4 = null;
        Constructor constructors[] = new Constructor[4];

        try {
            personClass = Class.forName("org.zhang.test.Person");
        } catch (ClassNotFoundException e) {
            System.out.println("没有找到Person 类");
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

        if (personClass != null) {
            try {
                constructors[0] = personClass.getConstructor();
                constructors[1] = personClass.getConstructor(String.class);
                constructors[2] = personClass.getConstructor(int.class);
                constructors[3] = personClass.getConstructor(String.class, int.class);

                person1 = (Person) constructors[0].newInstance();
                person2 = (Person) constructors[1].newInstance("shiwoo");
                person3 = (Person) constructors[2].newInstance(25);
                person4 = (Person) constructors[3].newInstance("shiwoo", 25);

                System.out.println(person1);
                System.out.println(person2);
                System.out.println(person3);
                System.out.println(person4);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } catch (InstantiationException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } catch (IllegalAccessException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } catch (InvocationTargetException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }

        }
    }
}


结果:
Person{name='no name', age=0}
Person{name='shiwoo', age=0}
Person{name='no name', age=25}
Person{name='shiwoo', age=25}


实例5:获取某个类所实现的所有接口


[java]
package org.zhang.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

interface Chiness{
    void say();
}

class Person implements Chiness{
    @Override
    public void say() {
        System.out.println("我是中国人");
    }
}

public class ReflectTest {
    public static void main(String[] args){

        Class<?> personClass = null;
        Class<?>[] interfaces = null;
        try {
            personClass = Class.forName("org.zhang.test.Person");
            interfaces = personClass.getInterfaces();
            for (Class<?> c : interfaces){
                System.out.println(c.getName());
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

    }
}


结果:
org.zhang.test.Chiness


实例6:获取父类


[java]
public class ReflectTest {
    public static void main(String[] args){

        Class<?> personClass = null;
        Class<?> superClass = null;
        try {
            personClass = Class.forName("org.zhang.test.Person");
            superClass = personClass.getSuperclass();
            System.out.println(superClass.getName());

        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

    }
}


结果:
java.lang.Object


实例7:获取修饰符、方法、返回类型等




[java]
package org.zhang.test;

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

interface Chiness{
    void say();
}

class Person implements Chiness{
    public Person(){

    }

    @Override
    public void say() {
        System.out.println("我是中国人");
    }
}

public class ReflectTest {
    public static void main(String[] args){

        Class<?> personClass = null;
        Constructor constructor = null;
        Constructor constructor2 = null;
        try {
            personClass = Class.forName("org.zhang.test.Person");
            constructor = personClass.getDeclaredConstructor();
            constructor2 = personClass.getConstructor();
            System.out.println(constructor);
            System.out.println(constructor2);

            int modifier = constructor.getModifiers();
            System.out.println("int modifier is: " + modifier);
            System.out.println("string modifier is: " + Modifier.toString(modifier));

            Method method = personClass.getMethod("say");
            int methodModifier = method.getModifiers();
            System.out.println(methodModifier);
            System.out.println(Modifier.toString(methodModifier));
            System.out.println(method.getReturnType());


        } catch (ClassNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (NoSuchMethodException e){
            e.printStackTrace();
        }

    }
}







摘自 小长弓




喜欢0 评分0
游客

返回顶部