`
jaesonchen
  • 浏览: 313434 次
  • 来自: ...
社区版块
存档分类
最新评论

避免使用反射实例化非静态内部类

 
阅读更多
//考虑到从Java 程序到class 文件的映射的复杂度,请避免使用反射来实例化内部类。
//更一般地讲,当我们在用高级语言特性定义的程序元素之上使用反射的时候,一定要小心,
//从反射的视角观察程序可能不同与从代码的视角去观察它。
//一个非静态的嵌套类的构造器,在编译的时候会将一个隐藏的参数作为它的第一个参数,
//这个参数表示了它的直接外围实例(immediately enclosing instance)。
//当你在代码中任何可以让编译器找到合适的外围实例的地方去调用构造器的时候,这个参数就会被隐式地传递进去。
//但是,上述的过程只适用于普通的构造器调用,也就是不使用反射的情况。当你使用反射调用构造器时,
//这个隐藏的参数就需要被显式地传递,这对于Class.newInstance 方法是不可能做到的。
//要传递这个隐藏参数的唯一办法就是使用java.lang.reflect.Constructor。
class Outer {
	void greetWorld() throws Exception {
		//抛出异常
		System.out.println( Inner.class.newInstance() );
	}
	void greetWorld1() throws Exception{
		Constructor<Inner> c = Inner.class.getConstructor(Outer.class);
		System.out.println(c.newInstance(Outer.this));
	}
	
	public class Inner {
		
		public String toString(){
			return "Hello world";
		}
	}
}

 

 

分享到:
评论

相关推荐

    JAVA反射机制的入门代码

    对于非静态方法,需要传入对应的实例对象。 5. **处理`properties`文件**:`properties`文件常用于存储配置信息,Java提供`java.util.Properties`类来读写此类文件。你可以使用`Properties`类的`load()`方法从输入...

    JAVA_内部类_反射机制

    静态嵌套类不能直接访问外部类的非静态成员,但可以通过外部类的实例访问。 3. 方法内部类:这些类被定义在方法的内部,它们的生命周期仅限于所在方法的执行。方法内部类可以访问方法的局部变量,但这些变量必须...

    java中的反射机制(内含大量实例)

    3. `Method` 类:代表类的方法,可以用来调用静态或非静态方法。`Class.getMethod()`和`Class.getMethods()`方法用于获取指定名称或所有公有方法,`getDeclaredMethod()`和`getDeclaredMethods()`则可以获取包括私有...

    java反射机制.pdf

    3. **`Method`**:表示类的方法,可以调用类的非静态方法。 4. **`Field`**:表示类的字段,可以读写类的私有成员变量。 5. **`Modifier`**:提供了一组静态方法来解析和解释`Class`对象的修饰符信息。 #### 五、...

    Th09 序列化和反射Th09 序列化和反射

    - 静态字段不会被序列化,因为它们属于类而非实例。 - 反序列化时,需要确保类路径中存在与序列化时相同的类定义,否则会抛出异常。 **反射(Reflection)** 反射是Java提供的一种强大的工具,它允许程序在运行时...

    android单例

    因此,尽量避免在单例中存储非静态的Context引用,或者使用Application的Context。 总结来说,Android中的单例模式主要用于创建全局唯一、线程安全的对象,以优化性能并简化资源管理。开发者可以根据具体需求选择...

    单例模式的5种设计.docx

    使用枚举创建单例是最简洁且安全的方法,Java的枚举天生就是线程安全的,且不允许继承,避免了反射和序列化导致的多次实例化问题。这种方式在很多情况下是最佳选择,但可能不适用于需要扩展或具有复杂生命周期管理...

    java类加载过程详解.doc

    a) 初始化的时机:类或接口会在首次主动使用时被初始化,包括创建类实例、调用静态方法、访问静态字段(非final)、反射、启动类等六种情况。被动使用类不会触发初始化。 b) 初始化的具体行为:执行类变量初始化...

    2 单例模式-MOOC课程内容.pdf

    SingletonHolder是一个私有的静态内部类,在Singleton类被加载时,SingletonHolder不会被加载,因此不会立即实例化Singleton。当getInstance()方法首次被调用时,SingletonHolder才会被加载,这时内部类...

    java 反射-(reflect)

    因此,在非必要情况下,应避免过多使用反射。 总结,Java反射是一个强大的特性,它使得程序在运行时能够动态地获取和修改类的信息。然而,使用时需谨慎,平衡其带来的灵活性和可能的性能损失。对于开发者来说,深入...

    Java反射机制的原理及在Android下的简单应用[归纳].pdf

    对于静态方法,可以不传入对象,对于非静态方法,需要传入对象实例。 5. **处理泛型**:虽然反射不能直接获取到泛型信息,但可以通过获取到的方法或字段的类型推断出泛型的实际类型。 6. **处理注解**:`...

    Runtime_实例变量遍历

    首先,`Runtime`类并不直接实例化,而是通过`Runtime.getRuntime()`获取当前运行时的实例。这个单例设计模式确保了在整个应用程序生命周期中只有一个`Runtime`对象存在,避免了资源的浪费和不必要的冲突。 当我们...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例122 静态内部类的简单应用 154 第2篇 Java高级应用 第6章 多线程技术 158 6.1 线程的基础 159 实例123 新建无返回值的线程 159 实例124 查看线程的运行状态 160 实例125 查看JVM中的线程名 161 实例126 查看和...

    总结-Milo1

    - 静态内部类:如果你希望内部类能独立于外部类实例存在,或者需要在不创建外部类对象的情况下创建内部类对象,应使用静态内部类。 - 匿名内部类:当需要快速实现一个简单的接口或父类时,可以使用匿名内部类,...

    java 基础知识 电子书

    非静态内部类(也称为成员内部类)可以访问外部类的私有成员,而静态内部类则不行。它们通常用于封装特定于外部类的功能或数据。 4. **线程** - **线程**是程序执行的最小单元,允许多个任务同时进行。Java内置了...

    MyJAVA(tarena课堂笔记总结)

    ### MyJAVA(tarena课堂笔记总结) ...- **静态内部类方式**:利用了Java的类装载机制来保证初始化实例时只有一个线程。 综上所述,这些知识点涵盖了Java的基础和进阶特性,对于理解和掌握Java编程语言非常重要。

    singleton面试题转

    - **控制实例化过程**:Singleton模式确保了类只有一个实例,避免了资源的浪费。 - **全局访问点**:提供了全局访问该实例的静态方法,方便使用。 - **线程安全**:在多线程环境下,正确实现的Singleton模式可以保证...

Global site tag (gtag.js) - Google Analytics