`
剑锋无刃
  • 浏览: 32018 次
  • 性别: 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 利用反射获取内部类静态成员变量的值操作.docx

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

    内部类与反射机制详解

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

    JAVA_内部类_反射机制

    JAVA_内部类_反射机制

    利用反射生成泛型类对象

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

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

    博客《 夯实JAVA基本之二 —— 反射(3):类内部信息获取》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/50107951

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

    Java——枚举: enum关键字、Enum类 类集对枚举的支持——EnumMap类与EnumSet类 枚举类实现接口、在枚举类中定义抽象方法 Java反射机制: Class类、Class类的使用 反射的应用:取得类的结构

    java反射实例

    java反射实例

    java_反射实战代码

    反射API可以获取程序在运行时刻的内部结构,反射API提供的动态代理是非常强大的功能,可以原生的实现AOP中的方法拦截功能,反射API就好像在看一个Java类在水中的倒影,知道Java类的内部结构,就可以和它们进行交互,...

    Java反射机制——类的加载方法,创建对象,获取方法以及结构

    反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。 框架=反射+注解+设计模式   1.是什么? 加载完类之后,在堆内的方法区中就产生了一个Class类型的...

    反射机制和类加载机制学习总结

    反射机制和类加载机制学习总结 Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并...

    利用反射获取DLL或EXE文件的内部信息。

    利用反射获取.net托管的DLL或EXE文件的内部信息,包括DLL或EXE文件内部的模块、类、方法、字段等信息。

    forname实现工程内部反射机制

    实现工程内部的反射机制,通过加上包名能够访问工程内的任意类。

    java的反射机制及其实际应用

    反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。

    JAVA新特性--java反射、映射

    反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。

    一键换肤,反射工具类

    一键换肤主要代码,反射工具类,内部有福利

    java r反射源代码

    java 反射 reflect 源代码,包括,内部类,类,方法等三种实现。可直接运行

    01:详解C#中的反射.pdf

    但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。 获取给定类型的Type引用有3种常用方式: ●使用 C# typeof 运算符。 Type t...

    652.650.JAVA基础教程_反射-获取运行时类的方法的内部结构(652).rar

    652.650.JAVA基础教程_反射-获取运行时类的方法的内部结构(652).rar

    java 反射Reflection;Class类

    是被视为动态语言的关键,反射机制允许程序在执行期借助Reflection API取得任何类的内部信息并能直接操作任意对象的内部属性及方法。 java反射机制所提供的功能: 生成动态代理 在运行时判断任意一个对象所属的类 在...

Global site tag (gtag.js) - Google Analytics