Java 反射的理解

先来讲说一些基本的概念: html

class:一个类有多个对象(实例)。在内存中类只有一份,而实例有多份。(这对于Java锁的运行是十分重要的) java

Type 与Class的关系: this

概念: spa

类型的概念与值的概念相对立,前者是程序中的概念,后者则是程序运行时的概念,二者经过标识值的语言成分(例如,变量、表达式等)联系起来。 .net

好比变量v说明为具备类型T,类型T所刻划的值集为{v1,v2,…vn,…},则变量v运行时能取且只能取某个vi为值。因而可知,类型规定了具备该类型的变量或表达式的取值范围。 code

共性:

在对象式语言中,“值”为对象(或对象指引,但本质上仍为对象)。因此,对象式语言中的类型刻划了一组对象及其上可施行的操做。类型所刻划的对象称为类型的实例。类也刻划了一组对象。 orm

二者的共性在于两者均刻划了一组对象及其上的操做(在前面关于类的讨论中,并未强调类刻划对象上的操做这一事实),因此,既能够说对象是类型的实例,也能够说对象是类的实例,类型和类在与对象的关系上是相同的。不过,类型欲刻划一组对象及其上的操做,必须借助于类,由于类是达到这种目的的惟一设施。因而可知,类型是以类为基础的,是经过类来定义的,这体现了两者的联系。 htm

区别:

l 做用不一样 对象

类是程序的构造单位,是描述一组对象及其上操做的惟一语言成分,故其做用主要是具体描述这组对象,提供运行时建立这些对象的“模板”。例如,基于类间的继承关系的派生类定义设施就反映了类在描述对象方面的做用。 blog

类型则是标志变量或表达式取值范围的一种语言成分,其做用主要是对这些变量或表达式运行时的取值进行约束。例如,对赋值语句左部的变量和右部的表达式的类型匹配检查就反映了类型的约束做用。

l 与对象联系的紧密程序不一样

类描述对象的具体形式和其上可施行的具体操做,且强调所描述的一组对象的共性,于是,与具体对象联系较密切,而与对象集的大小则联系较少。

类型强调所描述的一组对象的范围和可施行操做的范围,与对象集的大小联系较密切,而与其中具体对象则联系较少。

/*

类描述了实例能作什么,而类型决定了实例能作多大的事

*/

//这句话感受是对的,但我还找不到很好的说明,往后再来解决。

l 并非全部类均可直接做为类型使用

类是类型的基础,类型靠类来定义,有些类可直接做为类型来使用,在这种意义下,咱们也可称这些类是类型。

可是,也有一些类不能直接做为类型来使用,这是由于,从类型的约束做用来看,类型强调所刻划的对象的肯定性,即对象范围的肯定性。所以,只有所描述的对象的范围肯定的类才可直接用做类型。

//下面就是反射的实例

反射经常使用 Constructor,Field,Method.

package com.it.train.reject;

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


/**
 * Created by 55 on 2016/4/6.
 */
public class ReflectTest {

    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public ReflectTest() {
    }

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

    public ReflectTest copy(ReflectTest object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class invokeTestInstance = object.getClass();
        Field[] fields = invokeTestInstance.getDeclaredFields();

        for(Field field:fields){
            String fieldName = field.getName();
            String getMethodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
            String setMethodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
            System.out.println(field.getType());
            Method getMethod = invokeTestInstance.getMethod(getMethodName, new Class[]{});
            Method setMethod = invokeTestInstance.getMethod(setMethodName, field.getType());

            Object value = getMethod.invoke(object, new Object[]{});
            setMethod.invoke(object, value);
        }

        //invokeTestInstance.getConstructor();

        return  object;
    }


    public void add(){
        System.out.println("add");
    }

    public void add(Integer a){
        System.out.println(a.intValue() + age);
    }

    public static void main(String[] args) throws Exception {
        ReflectTest invokeTest = new ReflectTest(23);
        ReflectTest newinvokeTest = null;
        newinvokeTest = invokeTest.copy(invokeTest);
        System.out.println(newinvokeTest.getAge());
        System.out.println(invokeTest.getClass().getConstructor(int.class).newInstance(11).getAge());

    }
}



本文参考了:http://www.blogjava.net/magibt/articles/161288.html?opt=admin

相关文章
相关标签/搜索