文档章节

Java 反射的理解

Galy_绿
 Galy_绿
发布于 2016/04/06 16:31
字数 1134
阅读 39
收藏 0

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

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

© 著作权归作者所有

Galy_绿
粉丝 12
博文 133
码字总数 14908
作品 0
海淀
私信 提问
最最最常见的Java面试题总结——第二周

String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性   String类中使用字符数组:保存字符串,所以String对象是...

Amsour丶
2018/08/13
0
0
对struts2的action接收参数的理解

只接收参数值(非对象) Action中的参数若前台只是单纯的传递值 如:Form中 后台接收的方法只要有setUserName();就可以了,因为是单纯的赋值。 后台对象接收参数 请求的格式: testAction? ...

低至一折起
08/19
7
0
云妹总结了一些最最最常见的Java面试题供大家参考

云妹导读:String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性 String类中使用字符数组:private final cha...

阿里云科技快讯
2018/08/17
0
0
java反射

java反射真的就那么影响性能吗? 但是随便建一个项目调试源代码就有反射怎么解释? 所以是不是可以理解为java的反射现在的效率已经优化的差不多了?

开源中国顶顶顶
2018/07/12
476
3
java 面试知识点笔记(一)底层知识 jvm相关

问:谈谈你对java的理解? 平台无关性(一处编译多处运行) GC(垃圾回收机制) 语言特性(泛型、反射、lambda表达式) 面向对象(封装继承多态) 类库(集合、网络库、并发库、nio) 异常处...

断风格男丶
05/14
36
0

没有更多内容

加载失败,请刷新页面

加载更多

[转] Java 无界阻塞队列 DelayQueue 入门实战

原文出处:http://cmsblogs.com/ 『chenssy』 DelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元...

泥瓦匠BYSocket
2分钟前
0
0
zk中集群版中角色和消息类型

服务器角色 LEADER LEARNER FOLLOWING OBSERVER 消息类型 数据同步 服务器初始化 请求处理型 会话管理型 LEADER 集群工作核心,作用有: 1事务请求唯一调度和处理者,保证事务处理顺序性 2集...

writeademo
4分钟前
0
0
阿里云推送的基本使用-Swift;iOS10+

func initCloudPush(){ CloudPushSDK.asyncInit("*****", appSecret: "*******") { (result) in if result!.success{ print("deviceId===......

west_zll
16分钟前
1
0
分布式及高可用元数据采集原理

转载本文需注明出处:微信公众号EAWorld,违者必究。 引言: 元数据采集是元数据产品的核心部分,如何提升采集效率是需要仔细斟酌的事情,既要保持稳定性也要保持跟上主流技术的发展趋势。元...

EAWorld
31分钟前
1
0
为构建社交关系链手淘都做了啥?

作者|王卫(泓冰) 出品|阿里巴巴新零售淘系技术部 01、淘宝社交关系推荐的背景 1、互联网下半场到来:互联网的下半场,人口红利消失,各大平台需要对用户做精细化运营,用户的增长和留存是每一...

阿里云官方博客
32分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部