- 浏览: 295601 次
- 性别:
- 来自: 福建龙岩
文章分类
- 全部博客 (201)
- JavaSE (20)
- Struts1 (7)
- Struts2 (0)
- Hibernate (0)
- Spring (2)
- Flex (0)
- Ajax (1)
- web (20)
- Database (17)
- jsp/servlet (1)
- javascirpt (14)
- freemarker (2)
- jquery (6)
- SEO优化 (26)
- JSP&Servlet (1)
- PHP (32)
- CSS (12)
- Magento (9)
- 网站性能优化 (3)
- Flash (1)
- 生活 (3)
- 网站建设 (15)
- ZenCart (12)
- web自动化 (1)
- 企业应用 (1)
- LINUX (4)
- 字符集 (2)
- Delphi (1)
- C# (4)
- 移动互联网 (1)
- Vim (1)
最新评论
-
谷超:
第一次搞freemarker,test.ftl这个文件应该放在 ...
freemarker入门例子 -
zyhui98:
file_get_contents用不了
通过IP获取地理位置 -
ljx0517:
那ff下无法获取 路径怎么办呢
common-fileupload中FileItemStream的getName()方法 -
kaixuan_166:
多谢,刚好用到
通过Google获取天气预报信息 -
lufengdie:
借用下,嘿嘿··
java查询IP物理地址
原文http://www.iteye.com/topic/585900
- /*
- * 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)));
- }
- }
/* * 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;>;
字符串都有了,你怕什么呢?呵呵!
后话:这个方法并不应该被推荐,因为java api下并未提供任何方法实现,也就是说我们必须在特定环境和版本下才能这样干,至少得是1.5之后的版本以后sun(现在是oracle了)准备怎么改,这个是他的说法。。。
--------------------------------------------------------------------
OK,这个是一个引子,从这里我们看到了好些个玩意,也就是java其实提供了获取的方案的
那么我们要进行私有操作的,这样对我们写代码养成这样的习惯可不好,没事就去拿私有的东西,那是不是应该有公共的方法呢?我们试一下
将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
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());
- }
- }
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()
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
getGenericType public Type getGenericType()返回一个 Type 对象,它表示此 Field 对象所表示字段的声明类型。 如果 Type 是一个参数化类型,则返回的 Type 对象必须准确地反映源代码中使用的实际类型参数。 如果底层字段的类型是一个类型变量或者是一个参数化类型,则创建它。否则将解析它。 返回: 返回表示此 Field 对象所表示字段的声明类型的 Type 对象 抛出: GenericSignatureFormatError - 如果一般字段签名不符合 Java Virtual Machine Specification, 3rd edition 中指定的格式 TypeNotPresentException - 如果底层字段的一般类型签名引用了不存在的类型声明 MalformedParameterizedTypeException - 如果底层字段的一般签名引用了一个因某种原因而无法实例化的参数化类型 从以下版本开始: 1.5
由此可见,在1.5之后添加了众多以Generic为关键字的方法,这些方法就是用来获取泛型参数的有效途径,但是或许表面上看不出来,因为他们都是返回的Type接口,而非ParameterizedType接口,所以我困惑了很久。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]);
- }
- }
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的方式发现了代码的运行过程,最终找到了核心字符串,说明即使是檫除式的泛型java也会记录下这些东西,没道理拿不到
发表评论
-
几款开源web自动化测试工具
2011-08-03 02:24 17121 测试 WEBSELENIUM可以 ... -
SiteMesh使用入门
2011-01-20 12:43 882sitemesh应用Decorator模式,用filte ... -
HTTPClient详解
2010-11-15 16:06 3140HttpClient是实现了HTTP1.0和1.1标准的jav ... -
Java制作自动访问网站机器人!(转)
2010-10-25 16:02 1378如何制作一些论坛的自动发言机器人?(如果没有图片验证码的话!) ... -
dom4j读写xml
2010-10-25 12:26 766import java.io.File;import java ... -
通过Google获取天气预报信息
2010-08-12 14:38 2137要获得天气预报信息可用利用Google提供的借口, ht ... -
Java获取操作系统以及浏览器信息
2010-08-11 17:52 2014Properties props=System.getProp ... -
java操作时间日期类
2010-07-29 18:18 747有时候,我们需要把一个特定的字符串转成日期类型,有时候又要把日 ... -
用java把中文转拼音
2010-07-14 10:30 1550实现用java将中文字转成相应的拼音,能实现大多数的汉字。源码 ... -
java操作cookie
2010-07-01 15:27 789import javax.servlet.http.Cooki ... -
理解ThreadLocal
2010-06-29 14:42 637早在JDK 1.2的版本中就提 ... -
java查询IP物理地址
2010-06-23 18:46 1692根据访问的IP得到具体的IP物理地址,在这里要采用HttpUR ... -
java邮箱验证正则表达式
2010-06-11 15:11 2606"^([a-z0-9A-Z]+[-|\\.]?)+[ ... -
字符集系列之----字符集和编码
2010-06-10 10:36 753很久很久以前,有一群 ... -
字符集系列之-----字符集、编码概念
2010-06-10 10:35 784要谈编码就要先谈两个十分容易混淆的概念,一个是编码字符集 (C ... -
字符集系列之----深入字符集和编码
2010-06-10 10:34 489一、什么是字符集?什么是编码? 字符(Character)是文 ... -
每隔一段时间生成随机数
2010-05-07 16:48 1666import java.util.Random; im ... -
common-fileupload中FileItemStream的getName()方法
2010-04-06 17:16 4464在使用common-fileupload的Fil ... -
IO流复习(列出指定目录下的指定格式文件)
2010-02-25 15:50 1034import java.io.*; import java. ...
相关推荐
综上所述,虽然Java泛型在编译后会进行类型擦除,但通过上述技巧,我们仍然能够在运行时获得关于泛型类实例化类型的一些信息。在实际开发中,这些方法可以帮助我们编写更加灵活和安全的代码。在示例文件`GenericRTTI...
Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析。 一、泛型的基本概念 泛型是Java 5中...
Java 泛型是Java SE 5.0引入的一项重要特性,极大地增强了代码的类型安全性和重用性。泛型接口是泛型在接口中的应用,它允许我们在接口中定义带有类型参数的方法,使得实现该接口的类可以使用不同的数据类型。下面...
Java泛型技术的发展不仅标志着编程语言对类型安全和代码复用的重视,也反映了软件工程领域对模块化、复用性和维护性的不断追求。自JDK1.4以来,泛型技术已成为Java开发不可或缺的一部分,极大地提升了开发效率和代码...
3. **类型擦除**:Java的泛型在编译后会执行类型擦除,这意味着在运行时,所有的泛型类型信息都会丢失。因此,虽然在编译时提供了类型检查,但在运行时,泛型对象仍然是Object类型。这就是为什么你仍然可以将任何...
- **泛型擦除的影响**:运行时不能获取类型参数的具体类型,也无法实例化泛型类型参数。 - **类型参数的限制**:类型参数不能用于静态上下文中,因为静态成员与类关联而非对象关联。 #### 结语 通过本文的介绍,...
在Java中,泛型是一种允许开发者在类、接口和方法中使用类型参数的功能。通过使用泛型,可以在编写代码时指定一个或多个类型参数,从而使得编写的代码更加灵活且重用性更高。这种机制在Java 5中被引入,并在集合框架...
例如,以下代码在Java 7中是不合法的,因为编译器无法从上下文中推断出`ArrayList`的泛型类型: ```java List<String> list = new ArrayList(); list.add("A"); list.addAll(new ArrayList()); ``` 在Java 8中,...
虽然Java编译器在编译期间检查泛型类型的有效性,但在生成字节码时会进行所谓的“类型擦除”过程。这意味着在运行时,泛型类型信息会被抹去,所有泛型类型都会转换成其对应的原始类型。 例如,`List<String>` 和 `...
泛型是Java SE 5版本引入的一个新特性,它的主要目的是允许在使用类、接口和方法时能够引用到任何类型的对象,同时在编译期间就能进行类型检查,提供更安全的代码。泛型类和泛型方法可以提高代码的复用性,并减少...
8. 泛型集合:泛型引入后,Java 集合框架得到了极大的增强。使用泛型集合,可以避免在添加、删除和访问元素时出现 ClassCastException。 9. 泛型和多态:泛型可以与多态结合使用,使代码更加灵活。例如,一个接受 `...
Java 泛型是Java 5引入的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的重用性和安全性。泛型的主要目的是在编译时检查类型安全,并且允许程序员以更方便的方式操作集合。 1. **无泛型的...
这意味着所有泛型类型最终都会被转换为非泛型类型。例如,`List<String>`和`List<Integer>`在运行时实际上是相同的类型,都被擦除成了`List`。 ##### 类型擦除的影响 - **静态成员问题**:泛型类中的静态成员无法...
例如,类型擦除(Erasure)是Java泛型的一个重要概念,意味着泛型信息在编译后将被擦除,使得在运行时无法获得泛型类型的详细信息。因此,不能使用instanceof检查泛型类型的参数化形式,只能检查其擦除形式,例如...
例如,如果泛型类中的方法接受或返回泛型类型,那么应该考虑使用类型参数来定义这些方法,以保持类型安全性。 7. 通配符的使用场景: 通配符在读取时使用非常方便,因为读者不需要关心具体的类型。但在写入时就有...
Java 7引入了改进的泛型类型推断,称为“钻石操作符(Diamond Operator)”,使得在实例化时可以省略类型参数,编译器会根据变量声明推断类型: ```java Map, String> myMap = new HashMap(); ``` 但是,Java 7的...