反射:
反射:在运行时动态分析或使用一个类进行工作。
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设计模式
2012-04-20 16:45 1211一、什么是软件设计模式? 设计模式:是一套被反复使用、多数 ... -
Thread 与Runnab le区别
2012-03-02 14:05 1970大家都知道多线程可以 ... -
I/O流与文件
2012-02-06 15:22 835I/O流 字节输入流:InputStream类为所有 ... -
多线程
2012-02-06 15:23 753多线程: 进程与线程: 进程:同一个操作系统中 ... -
布局管理器与事件处理
2012-02-06 15:23 884图形界面: 布局管 ... -
异常与图形界面
2012-02-06 15:23 704异常: 异常的分类 ... -
java集合框架
2012-03-26 19:33 878集合:保存多个其他对象的对象,不能保存简单类型 Li ... -
抽象类与接口
2012-02-05 19:17 733修饰符abstract:抽象 ... -
关键字
2012-02-05 19:14 676修饰符static: 把对 ... -
类与对象
2012-02-05 19:13 685类和对象: 类:主观抽象,是对象的模板,可以实例化对 ... -
java环境配置与基本概念
2012-02-05 19:11 657配置java环境变量: JAVA_HOME:配置JD ... -
运算符、流程控制以及数组
2012-02-05 19:09 791局部变量:不是声明 ... -
登陆界面的开发
2012-01-08 17:36 789在开发登陆界面的前面,我们先须要熟悉和熟练构造方法,构造方法 ... -
类与对象
2012-01-08 16:54 764什么是面向对象的编程? OOP:1、在程序中模拟现实世界中的 ... -
类与对象
2012-01-08 16:50 749什么是面向对象的编程? OOP:1、在程序中模拟现实世界中的 ... -
java中能当做基本数据类型的类String
2012-01-08 15:47 772String是java中的一个类,而不是一种基 ... -
java虚拟机与java跨平台运行的关系
2012-01-08 15:24 9991、现写一个简单的java小程序 publicv cl ... -
java中的关键字
2011-11-19 23:45 783最近系统的学习了java的关键字,我才发现原来不知 ... -
与java第一次亲密的接触
2011-11-01 21:58 765刚开始学JAVA时,只知道不停的看书。从 ...
相关推荐
### 反射私有内部类的例子 #### 一、引言 在Java编程语言中,反射(Reflection)是一项强大的功能,允许程序在运行时检查和修改自身结构与行为。通过反射,可以动态地获取类的信息并操作其字段、方法以及构造器等。...
### Java 利用反射获取内部类静态成员变量的值操作 #### 一、引言 在Java编程中,反射是一个非常强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够创建和操作对象。本文将详细介绍如何使用...
这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields...
2. 静态嵌套类:静态嵌套类(也称为静态内部类)与成员内部类相似,但它可以用`static`修饰。这意味着它们不与外部类的实例绑定,可以直接通过类名创建对象。静态嵌套类不能直接访问外部类的非静态成员,但可以通过...
第12章注解、反射、内部类、匿名内部类与Lambda表达式(第7版)
这篇博客《夯实JAVA基本之二 —— 反射(3):类内部信息获取》深入探讨了如何通过反射机制获取Java类的内部信息。在Android开发中,反射的应用尤为广泛,例如动态加载类、处理注解、适配不同设备等场景。 首先,要...
对于框架设计者来说,便捷的代码,是很重要的一部分。 反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。...希望能帮助那些为查找泛型构造器、非静态内部泛型类的对象生成而烦恼的童鞋。
本篇将主要讨论如何构造内部类对象以及如何通过反射来访问它们。 首先,我们来看一个简单的内部类示例: ```java package javalang; public class Outer { public static class Inner1 { // ... } } ``` 在这...
- **安全性问题**:虽然反射提供了一种强大的方式来访问类的内部细节,但它也可能导致安全性和性能方面的问题。因此,在使用反射时应格外小心。 ### 三、实战应用 #### 3.1 创建对象实例 除了访问私有成员外,反射...
5. **泛型与反射**:尽管Java反射不直接支持泛型类型,但可以通过方法签名或类的类型参数来间接获取泛型信息。 6. **访问限制与安全**:反射可以访问私有成员,但这可能会破坏封装性,因此在使用时需谨慎。此外,...
Java中的反射机制是Java语言的一项强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制主要通过java.lang.Class类和相关的类库来实现,它使得我们能够在运行时动态...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性和行为。反射机制使得我们能够在运行时动态地获取类的信息,并且能够创建对象、调用方法、访问字段,甚至改变类...
反射机制允许在运行时检查类的信息,包括类的结构、字段、方法等,并动态创建和访问对象。`java.lang.Class`类是反射的起点,我们可以通过以下三种方式获取`Class`对象: 1. 对象的`getClass()`方法。 2. 类的`....
1. 内部类与反射: Java内部类提供了在类内部定义类的能力,这可以用来封装数据或实现特定功能。使用反射处理内部类时,需要注意区分匿名内部类、静态内部类和非静态内部类。反射API允许我们获取内部类的Class对象...
反射是Java语言的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这包括对类、接口、构造器、方法和字段等进行访问和操作。反射的主要功能有: 1. **获取类的信息**:如类名...
Xposed框架的核心是其提供的API,其中`XposedHelper`是一个关键的反射工具类,方便开发者对Android系统的类和方法进行操作。本文将详细介绍如何将`XposedHelper`移植到非Xposed环境中,以及在Java反射技术方面的一些...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性、方法和构造器。通过反射,我们可以在不知道类名的情况下创建类的实例,调用方法,访问字段,甚至修改私有成员...
2. 解析类的结构,获取类的内部信息,如方法定义和属性定义。 3. 操作类(实例化、访问非静态成员、直接访问静态成员)或其实例(访问属性、调用方法、创建新对象)。 在Java反射中,`Class`类扮演着关键角色。它是...
在Java编程语言中,反射机制是一项强大的工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。反射机制的核心在于`java.lang.reflect`包中的类,如Class、Constructor、Method和Field。标题"反射机制...