日期:2014-05-20  浏览次数:20821 次

各位java精英们。请教个问题。【反射机制】
谁能给我笼统的讲解一下反射机制啊。最好不要太抽象。这块老是搞不懂
------解决方案--------------------
keyi kankan :http://zhidao.baidu.com/link?url=JboFeq55xciamFnGpVdZuhEgsyuH0Jm6ypjKW6Oo-8u1cXMCs0zNcmNbjqS-5KdQ8mZowmkiSQZ3eraT5tvV7a
------解决方案--------------------
反射、泛型、注解是框架源码的三巨头,而且往往与"模板模式"这个万能公式绑定,lz死活也要掌握这三个知识!
------解决方案--------------------
其实反射机制,这样说吧。jdk都要把类的字节码加入虚拟机中,你可以用new 来生产一个对象,也可以用一个class来生成一个对象。而class这个对象,可以获得对象的属性,方法,内部类以及注解,你就可以认为,class包含了一个类的所有信息。反射就是通过class来得到信息。不管方法还是属性,都可以调用。这个就是反射机制。可以太泛了,不知道你能不能理解。
------解决方案--------------------
楼上的解答都没有干货。我给你一些代码,自己看看就知道了

package 反射机制;

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

/**
 * Java反射机制:
 *  通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们.
 *  进一步说,struts2框架就是基于反射机制做出来的,当然还包括泛型,多线程等等
 * */
/**
 *1. class.getField(String name)和class.getDeclaredField(String name)的区别:
 * 一个是访问public的变量,一个是private的变量
 * 
 *2.在Class中提供了4个相关的方法获得类型的属性:
 * getField(String name):Field
 * getFields():Field[]
 * getDeclaredField(String name):Field
 * getDeclaredFields():Field[]
 * 其中getField用于返回一个指定名称的属性,但是这个属性必须是公有的,这个属性可以在父类中定义。如果是私有属性或者是保护属性,那么都会抛出异常提示找不到这个属性。
 * getFields则是返回类型中的所有公有属性,所有的私有属性和保护属性都找不到。
 * getDeclaredField获得在这个类型的声明中定义的指定名称的属性,这个属性必须是在这个类型的声明中定义,但可以使私有和保护的。
 * getDeclaredFields获得在这个类型的声明中定义的所有属性,包括私有和保护的属性都会被返回,但是所有父类的属性都不会被返回。
 * */
class  Person{
 private int age;
 
 private String name;
 
 public Person(){
 
 }
 
 public Person(int age, String name){
 this.age = age;
 this.name = name;
 }
 
 public int getAge() {
 return age;
 }
 
 public void setAge(int age) {
 this.age = age;
 }
 
 public String getName() {
 return name;
 }
 
 public void setName(String name) {
 this.name = name;
 }
}

class SuperMan extends Person implements ActionInterface{
 private boolean BlueBriefs;
 
 public void fly(){
 System.out.println("----------");
 }
 
 public boolean isBlueBriefs(){
 return BlueBriefs;
 }
 
 public void setBlueBriefs(boolean blueBriefs) {
 BlueBriefs = blueBriefs;
 }

 public void walk(int m){
 System.out.println("----------" + m);
 }


interface ActionInterface{
public void walk(int m);
}

public class 举例一 {
/**
 * 为了看清楚Java反射部分代码,所有异常我都最后抛出来给虚拟机处理!
 */
 public static void main(String[] args) throws Exception{
 Demo2();
 }
 
 /**
  * Demo1: 通过Java反射机制得到类的包名和类名
  */
 public static void Demo1(){
 Person person = new Person();
 System.out.println("包名:" + person.getClass().getPackage().getName() +"----" + "类名:" + person.getClass().getName());
 }
 
 /**
  * Demo2: 验证所有的类都是Class类的实例对象
  * @throws ClassNotFoundException 
  */
 public static void Demo2() throws ClassNotFoundException
 {
 /*定义两个类型都未知的Class , 设置初值为null, 看看如何给它们赋值成Person类*/
 Class<?> class1 = null;
     Class<?> class2 = null;
     Class<?> class3 = null;
        
     /*写法1, 可能抛出 ClassNotFoundException [多用这个写法]*/
     class1 = Class.forName("反射机制.Person");
     System.out.println("包名:" + class1.getPackage().getName() +"----" + "类名:" + class1.getName());
        
     //写法2
     class2 = Person.class;
     System.out.println("包名:" + class2.getPackage().getName() +"----" + "类名:" + class2.getName());
     
     //写法3
     Person person = new Person();
     class3 = person.getClass();
     System.out.println("包名:" + class3.getPackage().getName() +"----" + "类名:" + class3.getName());