`
剑锋无刃
  • 浏览: 34056 次
  • 性别: Icon_minigender_1
  • 来自: 长沙市
最近访客 更多访客>>
社区版块
存档分类
最新评论

反射与内部类

    博客分类:
  • java
阅读更多

 

反射:

反射:在运行时动态分析或使用一个类进行工作。

java.lang.Class类:描述类信息的类。

类对象:描述一个类信息的对象,当虚拟机加载类的时候,就会创建这个类的类对象并加载该对象,Class是类对象的类型。

获得类对象的方式:

用" 类名.class "获得这个类的类对象。

用类的对象掉用getClass(),如object.getClass()得到这个对象的类型的类对象。

可以使用Class.forName(类名),也可以得到这个类的类对象,(注意,这里写的类名必须是全限定名(全名),是包名加类名,XXX.XXX.XXXX)。

基本类型也有类对象,用" 封装类.TYPE "可以获得对应的基本类型的类对象。

 

java.lang.reflect包下的三个重要类:

Field属性类:用来描述属性的信息。

Method方法类:方法的信息的描述。

Constructor构造方法类:用来描述构造方法的信息。

 

Class类中的常用方法:

newInstance() 

创建此 Class 对象所表示的类的一个新实例(调用无参构造创建的对象)。

getDeclaredMethods()

获得的是一个Method方法类对象的数组,获得本类(不包括父类)声明的所有(包括private的)方法对象。

getMethods()     //推荐使用

获得的是一个Method方法类对象的数组,获得所有(父类的也包括)publice的方法对象。

getDeclaredConstructors()

获得的是一个Constructor构造方法类对象的数组,获得这个类声明的所有构造方法对象。

getConstructors()    //推荐使用

获得的是一个Constructor构造方法类对象的数组,获得所有publice的构造方法对象。

getDeclaredFields()    //推荐使用

获得的是一个Field属性类对象的数组,获得本类声明的所有属性的属性对象。

getFields()

获得的是一个Field属性类对象的数组,获得所有publice的属性对象。

使用反射构造一个类的对象的步骤:

a. 获得类对象

b. 获得构造方法对象

c. 获得对象,用构造方法对象调用构造方法,如果使用无参构造方法,可以跳过第二步,直接使用" 类对象.newInstance() "方法来获得这个类的对象

d. 获得方法对象

e. 用方法对象调用方法(用这个类的对象作为第一参数)

如下面的例子:

反射机制的实现类:

package day07.reflect;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

public class TestReflect {

public static Object get(String className , Map<String,Object> map) throws Exception{

Class c = Class.forName(className);                  //获得类对象

Object o = c.newInstance();                   //获得对象

Set<String> set = map.keySet();

for(String str : set){

String s = "set" + str.substring(0,1).toUpperCase()+str.substring(1);

Field f = c.getDeclaredField(str);

Method m = c.getMethod(s, f.getType());        //获得方法对象

m.invoke(o, map.get(str));                       //用方法对象调用方法

}

return o;

}

public static void main(String[] args) throws Exception {

Map m = new HashMap();

m.put("name", "zhang");

m.put("age", 22);

Object o = get("day07.reflect.Student",m);

Student s = (Student) o;

System.out.println(s.getName() + "   " + s.getAge());

Map m1 = new HashMap();

m1.put("name", "li");

m1.put("gender", "男");

Object o1 = get("day07.reflect.Teacher",m1);

Teacher t = (Teacher) o1;

System.out.println(t.getName() + "    " + t.getGender());

}

}

学生类:

package day07.reflect;

public class Student {

private String name;

private int age;

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

教师类:

package day07.reflect;

public class Teacher {

private String name;

private String gender;

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

内部类:

定义:

定义在另外一个类中的类,就是内部类。

编译后生成的两个独立的类:Outer.class 和Outer$Inner.class。

内部类的分类:

静态内部类:静态内部类定义在类中,任何方法外,用static修饰

静态内部类只能访问外部类的静态成员。

在外部类的外部,要创建一个静态内部类对象不需要外部类对象:

Outer.Inner in = new Outer.Inner();

在本类内部生成内部类对象的方式:

Inner in = new Inner();

成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列

在内部类中可以直接访问外部类的私有属性。

内部类和外部类的实例变量允许命名冲突。

在内部类中访问实例变量:this.属性

在内部类访问外部类的实例变量:外部类名.this.属性

在外部类的外部,要创建一个成员内部类对象,要首先建立一个外部类对象,然后再创建一个成员内部类对象。

Outer out = new Outer();

Outer.Inner in = out.new Inner();

在本类内部生成内部类对象的方式:

在静态方法中:Inner in = new Outer().new Inner();

在非静态方法中:Inner in = this.new Inner();

成员内部类不可以有静态成员,这是因为静态属性是在加载类的时候创建,这个时候内部类还没有被创建。

局部内部类:在外部类的方法中定义的内部类

与局部变量类似,在局部内部类前不可以加修饰符public和private,其作用域为定义它的代码块。

局部内部类不仅可以访问外部类的实例变量,还可以访问外部类的局部变量,但要求外部类的局部变量必须为final的。

配合接口使用,来做到强制弱耦合。

在外部类的外部不可创建局部内部类对象,只能在局部内部类所在的方法中创建:

Inner in = new Inner();

匿名内部类:一种特殊的局部内部类

没有名字,也没有class、extends、implements关键字

用一种隐含的方式实现一个接口或继承一个类,并且只能创建一次实例。

实现方式:在某个语句中,new 父类/父接口名字(){ 类体中实现方法 }

例如:

TreesSet ts = new TreeSet(new Comparator(){

public int compare(Object o1, Object o2){

return 0;

}

});

匿名内部类属于局部内部类,那么局部内部类的所有限制都对其生效。

匿名内部类是唯一一种无构造方法的类,因为构造器的名字必须合类名相同,而匿名内部类没有类名。

 

分享到:
评论

相关推荐

    反射私有内部类的例子

    ### 反射私有内部类的例子 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的功能,允许程序在运行时检查和修改自身结构与行为。通过反射,可以动态地获取类的信息并操作其字段、方法以及构造器等。...

    java 利用反射获取内部类静态成员变量的值操作.docx

    ### Java 利用反射获取内部类静态成员变量的值操作 #### 一、引言 在Java编程中,反射是一个非常强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够创建和操作对象。本文将详细介绍如何使用...

    内部类与反射机制详解

    这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields...

    JAVA_内部类_反射机制

    2. 静态嵌套类:静态嵌套类(也称为静态内部类)与成员内部类相似,但它可以用`static`修饰。这意味着它们不与外部类的实例绑定,可以直接通过类名创建对象。静态嵌套类不能直接访问外部类的非静态成员,但可以通过...

    第12章注解、反射、内部类、匿名内部类与Lambda表达式(第7版).pptx

    第12章注解、反射、内部类、匿名内部类与Lambda表达式(第7版)

    博客《 夯实JAVA基本之二 —— 反射(3):类内部信息获取》对应源码

    这篇博客《夯实JAVA基本之二 —— 反射(3):类内部信息获取》深入探讨了如何通过反射机制获取Java类的内部信息。在Android开发中,反射的应用尤为广泛,例如动态加载类、处理注解、适配不同设备等场景。 首先,要...

    利用反射生成泛型类对象

    对于框架设计者来说,便捷的代码,是很重要的一部分。 反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。...希望能帮助那些为查找泛型构造器、非静态内部泛型类的对象生成而烦恼的童鞋。

    讲解Java中如何构造内部类对象以及访问对象

    本篇将主要讨论如何构造内部类对象以及如何通过反射来访问它们。 首先,我们来看一个简单的内部类示例: ```java package javalang; public class Outer { public static class Inner1 { // ... } } ``` 在这...

    C#net反射实现访问类中的私有变量或者方法

    - **安全性问题**:虽然反射提供了一种强大的方式来访问类的内部细节,但它也可能导致安全性和性能方面的问题。因此,在使用反射时应格外小心。 ### 三、实战应用 #### 3.1 创建对象实例 除了访问私有成员外,反射...

    java反射实例

    5. **泛型与反射**:尽管Java反射不直接支持泛型类型,但可以通过方法签名或类的类型参数来间接获取泛型信息。 6. **访问限制与安全**:反射可以访问私有成员,但这可能会破坏封装性,因此在使用时需谨慎。此外,...

    Java中类的反射机制

    Java中的反射机制是Java语言的一项强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制主要通过java.lang.Class类和相关的类库来实现,它使得我们能够在运行时动态...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    反射,动态加载指定类调用类中的方法

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性和行为。反射机制使得我们能够在运行时动态地获取类的信息,并且能够创建对象、调用方法、访问字段,甚至改变类...

    Java期末复习——枚举与反射机制

    反射机制允许在运行时检查类的信息,包括类的结构、字段、方法等,并动态创建和访问对象。`java.lang.Class`类是反射的起点,我们可以通过以下三种方式获取`Class`对象: 1. 对象的`getClass()`方法。 2. 类的`....

    java r反射源代码

    1. 内部类与反射: Java内部类提供了在类内部定义类的能力,这可以用来封装数据或实现特定功能。使用反射处理内部类时,需要注意区分匿名内部类、静态内部类和非静态内部类。反射API允许我们获取内部类的Class对象...

    运用反射得到类中的属性和值

    反射是Java语言的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这包括对类、接口、构造器、方法和字段等进行访问和操作。反射的主要功能有: 1. **获取类的信息**:如类名...

    移植Xposed的反射工具类

    Xposed框架的核心是其提供的API,其中`XposedHelper`是一个关键的反射工具类,方便开发者对Android系统的类和方法进行操作。本文将详细介绍如何将`XposedHelper`移植到非Xposed环境中,以及在Java反射技术方面的一些...

    通过反射获取类的实例

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性、方法和构造器。通过反射,我们可以在不知道类名的情况下创建类的实例,调用方法,访问字段,甚至修改私有成员...

    JAVA反射机制与类的加载

    2. 解析类的结构,获取类的内部信息,如方法定义和属性定义。 3. 操作类(实例化、访问非静态成员、直接访问静态成员)或其实例(访问属性、调用方法、创建新对象)。 在Java反射中,`Class`类扮演着关键角色。它是...

    反射机制反射Dao 反射机制

    在Java编程语言中,反射机制是一项强大的工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。反射机制的核心在于`java.lang.reflect`包中的类,如Class、Constructor、Method和Field。标题"反射机制...

Global site tag (gtag.js) - Google Analytics