Java 反射的理解

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

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

Type 与Class的关系:

概念:

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

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

共性:

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

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

区别:

l 作用不同

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

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

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

你可能感兴趣的:(Java 反射的理解)