Java 反射的理解
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
先來說說一些基本的概念:
class:一個類有多個對象(實(shí)例)。在內(nèi)存中類只有一份,而實(shí)例有多份。(這對于Java鎖的運(yùn)行是十分重要的)
Type 與Class的關(guān)系:
概念:
類型的概念與值的概念相對立,前者是程序中的概念,后者則是程序運(yùn)行時的概念,兩者通過標(biāo)識值的語言成分(例如,變量、表達(dá)式等)聯(lián)系起來。
比如變量v說明為具有類型T,類型T所刻劃的值集為{v1,v2,…vn,…},則變量v運(yùn)行時能取且只能取某個vi為值。由此可見,類型規(guī)定了具有該類型的變量或表達(dá)式的取值范圍。
共性:
在對象式語言中,“值”為對象(或?qū)ο笾敢?#xff0c;但本質(zhì)上仍為對象)。所以,對象式語言中的類型刻劃了一組對象及其上可施行的操作。類型所刻劃的對象稱為類型的實(shí)例。類也刻劃了一組對象。
兩者的共性在于二者均刻劃了一組對象及其上的操作(在前面關(guān)于類的討論中,并未強(qiáng)調(diào)類刻劃對象上的操作這一事實(shí)),所以,既可以說對象是類型的實(shí)例,也可以說對象是類的實(shí)例,類型和類在與對象的關(guān)系上是相同的。不過,類型欲刻劃一組對象及其上的操作,必須借助于類,因?yàn)轭愂沁_(dá)到這種目的的唯一設(shè)施。由此可見,類型是以類為基礎(chǔ)的,是通過類來定義的,這體現(xiàn)了二者的聯(lián)系。
區(qū)別:
l 作用不同
類是程序的構(gòu)造單位,是描述一組對象及其上操作的唯一語言成分,故其作用主要是具體描述這組對象,提供運(yùn)行時創(chuàng)建這些對象的“模板”。例如,基于類間的繼承關(guān)系的派生類定義設(shè)施就反映了類在描述對象方面的作用。
類型則是標(biāo)志變量或表達(dá)式取值范圍的一種語言成分,其作用主要是對這些變量或表達(dá)式運(yùn)行時的取值進(jìn)行約束。例如,對賦值語句左部的變量和右部的表達(dá)式的類型匹配檢查就反映了類型的約束作用。
l 與對象聯(lián)系的緊密程序不同
類描述對象的具體形式和其上可施行的具體操作,且強(qiáng)調(diào)所描述的一組對象的共性,因而,與具體對象聯(lián)系較密切,而與對象集的大小則聯(lián)系較少。
類型強(qiáng)調(diào)所描述的一組對象的范圍和可施行操作的范圍,與對象集的大小聯(lián)系較密切,而與其中具體對象則聯(lián)系較少。
/*類描述了實(shí)例能做什么,而類型決定了實(shí)例能做多大的事
*/
//這句話感覺是對的,但我還找不到很好的說明,日后再來解決。
l 并不是所有類都可直接作為類型使用
類是類型的基礎(chǔ),類型靠類來定義,有些類可直接作為類型來使用,在這種意義下,我們也可稱這些類是類型。
但是,也有一些類不能直接作為類型來使用,這是因?yàn)?#xff0c;從類型的約束作用來看,類型強(qiáng)調(diào)所刻劃的對象的確定性,即對象范圍的確定性。因此,只有所描述的對象的范圍確定的類才可直接用作類型。
//下面就是反射的實(shí)例反射常用 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
轉(zhuǎn)載于:https://my.oschina.net/u/2450896/blog/653714
總結(jié)
以上是生活随笔為你收集整理的Java 反射的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js解析json字符串数组
- 下一篇: [Linux]控制语句If case