자바 획득 범 형

5479 단어 자바C++cbeanC#
최근 범 형 유형 을 얻 으 려 면 여러 가지 의견 을 정리 하고 실천 을 통 해 결 과 를 얻 었 다.
물론 많은 글 에 의 해 오도 되 었 다.
다음은 우리 가 예 를 하나 보 자. 이 예 는 내 가 쓴 것 이다.

/*
 * Copyright 2010 Sandy Zhang
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

/**
 * 
 */
package org.javazone.jroi.test.reflect;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Sandy Zhang
 */
public class Bean
{
	public Map<String, ListBean> list = new HashMap<String, ListBean>();

	public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException
	{
		Field c = Bean.class.getField("list");
		Field f = Field.class.getDeclaredField("signature");
		f.setAccessible(true);
		System.out.println(((String) f.get(c)));

	}
}

이것 은 단지 내 가 최근 에 반사 호출 된 것 을 쓰 고 생각 한 문제 이기 때문에 어 쩔 수 없 이 이렇게 물건 을 얻어 야 한다.
다음은 결과.

Ljava/util/Map<Ljava/lang/String;Lorg/javazone/jroi/test/reflect/ListBean;>;

문자열 이 다 있 는데 뭐 가 무서워 요?허허!
후 화: 이 방법 은 추천 되 어 서 는 안 됩 니 다. 자바 api 에서 어떠한 방법 도 제공 하지 않 았 기 때 문 입 니 다. 즉, 우 리 는 특정한 환경 과 버 전에 서 이렇게 해 야 합 니 다. 적어도 1.5 이후 의 버 전 이후 sun (지금 은 Oacle 입 니 다) 은 어떻게 고 칠 것 인 가 를 준비 해 야 합 니 다. 이것 은 그의 말 입 니 다.
--------------------------------------------------------------------
OK, 이것 은 도입부 입 니 다. 여기 서 우 리 는 많은 물건 을 보 았 습 니 다. 즉, 자바 가 사실은 얻 은 방안 을 제공 한 것 입 니 다.
그러면 우 리 는 개인 적 인 조작 을 해 야 한다. 이렇게 하면 우리 가 코드 를 쓰 는 습관 을 기 르 는 데 좋 지 않다. 일이 없 으 면 개인 적 인 물건 을 가 져 가 야 한다. 그러면 공공 적 인 방법 이 있어 야 하지 않 을 까?우리 한번 해 보 자.
main 호출 을 수정 합 니 다.

Field c = Bean.class.getField("list");
System.out.println(c.toGenericString());

public java.util.Map<java.lang.String, org.javazone.jroi.test.reflect.ListBean> org.javazone.jroi.test.reflect.Bean.list

봐 봐, 우리 가 뭘 얻 었 는 지, setAccess 필요 없어, 하하
아, 맞다. 혹시 내 가 필드 가 아니라면?방법 이 야. 어 떡 해.그래서

package org.javazone.jroi.test.reflect;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Sandy Zhang
 */
public class Bean
{
	public Map<String, ListBean> list = new HashMap<String, ListBean>();

	public Map<String, ListBean> getList()
	{
		return list;
	}

	public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException
	{
		System.out.println(Bean.class.getMethod("getList").toGenericString());
	}
}

public java.util.Map<java.lang.String, org.javazone.jroi.test.reflect.ListBean> org.javazone.jroi.test.reflect.Bean.getList()

---------------------------------------------------------------------
문자열 이 있 습 니 다. API 에서 도 일반적인 형식 을 직접 가 져 오 는 방법 을 제공 해 야 하 는 지 고려 해 보 겠 습 니 다. 참고 하 세 요.

getGenericType
public Type getGenericType()返回一个 Type 对象,它表示此 Field 对象所表示字段的声明类型。 
如果 Type 是一个参数化类型,则返回的 Type 对象必须准确地反映源代码中使用的实际类型参数。 
如果底层字段的类型是一个类型变量或者是一个参数化类型,则创建它。否则将解析它。 
返回:
返回表示此 Field 对象所表示字段的声明类型的 Type 对象 
抛出: 
GenericSignatureFormatError - 如果一般字段签名不符合 Java Virtual Machine Specification, 3rd edition 中指定的格式 
TypeNotPresentException - 如果底层字段的一般类型签名引用了不存在的类型声明 
MalformedParameterizedTypeException - 如果底层字段的一般签名引用了一个因某种原因而无法实例化的参数化类型
从以下版本开始: 
1.5 

이 를 통 해 알 수 있 듯 이 1.5 이후 에 Generic 을 키워드 로 하 는 방법 을 많이 추 가 했 습 니 다. 이런 방법 들 은 일반적인 매개 변 수 를 얻 는 효과 적 인 방법 입 니 다. 그러나 겉으로 볼 때 알 수 없 을 수도 있 습 니 다. 그들 은 모두 Parameterized Type 인터페이스 가 아니 라 되 돌아 오 는 Type 인터페이스 이기 때문에 저 는 오랫동안 곤 혹 스 러 웠 습 니 다.OK, 어떻게 이 루어 지 는 지 한번 봅 시다.

public class GenericTest
{
	public List<String> list = new LinkedList<String>();

	public static void main(String[] args) throws SecurityException, NoSuchFieldException
	{
		ParameterizedType pt = (ParameterizedType) GenericTest.class.getField(
				"list").getGenericType();
		System.out.println(pt.getActualTypeArguments().length);
		System.out.println(pt.getActualTypeArguments()[0]);
	}
}

1
class java.lang.String
여기 가 결과 예요.
---------------------------------------------------------------------
그래서 모든 문제 가 쉽게 풀 렸 다.
글 이 긴 것 같 습 니 다. 저 는 Debug 방식 으로 코드 의 운행 과정 을 발 견 했 습 니 다. 마지막 으로 핵심 문자열 을 찾 았 습 니 다. 이 는 사 프 라 이 프 식 의 범 자바 라 도 이런 것들 을 기록 할 것 이 고 가 져 갈 수 없다 는 것 을 설명 합 니 다.

좋은 웹페이지 즐겨찾기