`
hjhjw1991
  • 浏览: 582 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java反射机制初解

    博客分类:
  • Java
 
阅读更多

Reflect就是Java为了弥补不能动态改变程序结构、变量类型而搞出来的一个伪动态机制,可以在运行的时候才去获取一个类,而这个类在编译的时候并不知道其名字或结构。怎么理解呢?咱们来看例子

 

【案例1】通过一个对象获得完整的包名和类名

 

package Reflect;
 
/**
 * 通过一个对象获得完整的包名和类名
 * */

class Demo{
    //other codes...
}
 
class hello{
    public static void main(String[] args) {
        Demo demo=new Demo();
        System.out.println(demo.getClass().getName());
    }
}

 【运行结果】:Reflect.Demo

 

【案例2】实例化Class类对象

 

package Reflect;
class Demo{
    //other codes...
}
 
class hello{
    public static void main(String[] args) {
        Class<?> demo1=null;
        Class<?> demo2=null;
        Class<?> demo3=null;
        try{
            //一般尽量采用这种形式
            demo1=Class.forName("Reflect.Demo");
        }catch(Exception e){
            e.printStackTrace();
        }
        demo2=new Demo().getClass();
        demo3=Demo.class;
         
        System.out.println("类名称   "+demo1.getName());
        System.out.println("类名称   "+demo2.getName());
        System.out.println("类名称   "+demo3.getName());
         
    }
}

 【运行结果】:

 

类名称   Reflect.Demo

类名称   Reflect.Demo

类名称   Reflect.Demo

 

这样我们就得到了Class对象。接下来看看我们可以用这个Class做什么

【案例3】通过Class实例化其他类对象

这里我们先构造一个Person类,之后都会用到这个类作演示,就不再贴它的代码了。

 

package Reflect;
 
import java.lang.reflect.Constructor;
 
class Person{
     
    public Person() {
         
    }
    public Person(String name){
        this.name=name;
    }
    public Person(int age){
        this.age=age;
    }
    public Person(String name, int age) {
        this.age=age;
        this.name=name;
    }

    @Override
    public String toString(){
        return "["+this.name+"  "+this.age+"]";
    }
    public String name;
    public int age;
}

 紧接着主函数无参实例化Person类

 

 

class hello{
    public static void main(String[] args) {
        Class<?> demo=null;
        try{
            demo=Class.forName("Reflect.Person");
        }catch (Exception e) {
            e.printStackTrace();
        }
        Person per=null;
        try {
            //无参实例化
            per=(Person)demo.newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        per.name="Jack";
        per.age=20;
        System.out.println(per);
    }
}

 【运行结果】:

 

[Jack  20]

 

到这里大家应该有所感觉了。没错,这里是无参实例化,当Person这个类本身只有带参数的构造函数的时候,这样做会抛出异常,那么我们当然会猜测,newInstance()可不可以带参实例化?答案是肯定的,我们能想到,Sun的天才们肯定也能想到。唯一的问题是,事先我们可能并不知道Class有什么构造函数。代码奉上:

 

class hello{
    public static void main(String[] args) {
        Class<?> demo=null;
        try{
            demo=Class.forName("Reflect.Person");
        }catch (Exception e) {
            e.printStackTrace();
        }
        Person per1=null;
        Person per2=null;
        Person per3=null;
        Person per4=null;
        //取得全部的构造函数
        Constructor<?> cons[]=demo.getConstructors();
        //这里硬编码了,不可取
        try{
            per1=(Person)cons[3].newInstance();
            per2=(Person)cons[2].newInstance("Jack");
            per3=(Person)cons[1].newInstance(20);
            per4=(Person)cons[0].newInstance("Jack",20);
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println(per1);
        System.out.println(per2);
        System.out.println(per3);
        System.out.println(per4);
    }
}

 

 

 【运行结果】:

[Jack  20]

[null  20]

[Jack  0]

[null  0]

需要注意的是,获取的构造函数数组是倒序的,第一个构造函数在最后。

那么如果我们对构造函数一无所知,怎么办?也有办法,Java提供了获取特定构造函数及其参数类型的方法。

try {
//无对应构造函数会抛出NoSuchMethodException异常
				Constructor cot1 = demo.getConstructor(String.class);
				Constructor cot2 = demo.getConstructor(new Class[]{String.class});
				Constructor cot3 = demo.getConstructor(int.class);
				Constructor cot4 = demo.getConstructor(String.class,int.class);
				Class[] parameterTypes = cot2.getParameterTypes();
				per1 = (Person)cot1.newInstance("Jacky Chen");
				per2 = (Person)cot2.newInstance("Jacky");
				per3 = (Person)cot3.newInstance(20);
				per4 = (Person)cot4.newInstance("Jacky", 20);
} catch (NoSuchMethodException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
                System.out.println(per1);
	        System.out.println(per2);
	        System.out.println(per3);
	        System.out.println(per4);

  【运行结果】:

[Jacky Chen  0]

[Jacky  0]

[null  20]

 

[Jacky  20]

 

好了,我们现在已经可以动态实例化一个类。我们还可以做什么,比如,能不能获取类实现的接口?

【案例4】获取类实现的接口

首先定义一个接口China如下

interface China{
    public static final String name="Jack";
    public static  int age=20;
    public void sayChina();
    public void sayHello(String name, int age);
}

 然后让Person实现这个接口

class Person implements China{
    ...
    @Override
    public void sayChina(){
        System.out.println("hello ,China");
    }
    @Override
    public void sayHello(String name, int age){
        System.out.println(name+"  "+age);
    }
}

 主函数咱们这样写

class hello{
    public static void main(String[] args) {
        Class<?> demo=null;
        try{
            demo=Class.forName("Reflect.Person");
        }catch (Exception e) {
            e.printStackTrace();
        }
        //保存所有的接口
        Class<?> intes[]=demo.getInterfaces();
        for (int i = 0; i < intes.length; i++) {
            System.out.println("实现的接口   "+intes[i].getName());
        }
    }
}

  【运行结果】:

实现的接口   Reflect.China

 

接下来咱们还要讲如何获取父类、获取构造函数的修饰符、获取全部属性和方法,反射的应用(结合工厂模式,配合属性文件),相信大家会逐渐感受到反射的魅力。

【未完待续】

 

分享到:
评论

相关推荐

    java反射机制.zip

    java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...

    java反射机制源码

    java反射机制源码java反射机制源码java反射机制源码

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    java反射机制.md

    深入了解java反射机制的原理,通过反射机制可以破坏单例模式,如何防止通过反射机制拿到单例模式的构造器呢?用枚举类可破

    java反射机制讲解

    Java反射机制是Java语言提供的一种强大的能力,它允许我们在运行时检查类的信息并动态地创建和操作对象。这种机制使得程序具有更高的灵活性和扩展性,尤其是在框架开发中有着广泛的应用。 首先,我们要理解反射的...

    java反射机制应用

    ### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...

    java反射机制原理和反射机制总结

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。这一机制的核心在于`java.lang.Class`类和相关的API,它们提供了对类元数据的访问,使得我们能够在运行时...

    利用java反射机制的建议计算器源码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的动态性和灵活性。在这个“利用java反射机制的建议计算器源码”中...

    java反射机制详解

    ### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...

    Java反射机制

    ### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...

    java反射机制文档及代码

    Java反射机制是Java编程语言中一个强大的特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用方法以及...

    Reflection_in_Java.zip_in_java 反射_java 反射机制_java反射_反射机制

    Java反射机制是Java编程语言中一个强大的特性,它允许运行时的程序动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包下的类如`Constructor`、`Method`和`...

    java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者能够在运行时动态地获取类的信息(如类名、方法名、参数类型)并调用方法,创建对象,甚至...

    JAVA反射机制和JDBC和各种数据库的连接

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地创建对象、调用方法、访问字段,甚至修改私有成员,这极大地增强了代码的灵活性...

Global site tag (gtag.js) - Google Analytics