日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 反射的理解

發布時間:2025/3/20 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 反射的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

先來說說一些基本的概念:

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

轉載于:https://my.oschina.net/u/2450896/blog/653714

總結

以上是生活随笔為你收集整理的Java 反射的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。