一:目标

Ø理解 Class 类
Ø理解 Java 的类加载机制
Ø学会使用 ClassLoader 进行类加载
Ø理解反射的机制
Ø掌握 Constructor、Method、Field 类的用法
Ø理解并掌握动态代理
 
1、Class类

–对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。
对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。
一个 Class 对象包含了特定某个类的有关信息。
–  Class 对象只能由系统建立对象。
–  一个类在 JVM 中只会有一个Class实例。
–  每个类的实例都会记得自己是由哪个 Class 实例所生成 。
获取 Class 对象的方式:
 
 
Class类的常用方法:
 
三种类加载器(ClassLoader):
 
练习代码:
 package com.shellway.test;

 public class Person {
String name;
String age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} public Person(String name, String age) {
super();
this.name = name;
this.age = age;
System.out.println("有参数的构造器。。。。");
} public Person() {
System.out.println("无参数的构造器。。。。");
}
}

Person类

 package com.shellway.test;

 import static org.junit.Assert.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Field;
import org.junit.Test; public class ReflectionTest {
@Test
public void testClassLoader() throws ClassNotFoundException,
FileNotFoundException {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
System.out.println(classLoader);
classLoader = classLoader.getParent();
System.out.println(classLoader);
classLoader = classLoader.getParent();
System.out.println(classLoader); // 测试由哪个类加载器进行加载
classLoader = Class.forName("com.shellway.test.Person")
.getClassLoader();
System.out.println(classLoader); // 调用getResourceAsStream获取类路径下文件对应的输入流
InputStream in = null;
in = this.getClass().getClassLoader()
.getResourceAsStream("com/shellway/test/test.properties");
// new FileInputStream("com/shellway/test/test.properties");
System.out.println(in);
} @Test
public void testNewInstance() throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
String className = "com.shellway.test.Person";
Class clazz = Class.forName(className);
Object obj = clazz.newInstance();// 实际上调用的是无参数的构造器创建的实例。
System.out.println(obj);
} @Test
public void test() throws ClassNotFoundException {
// 1.得到Class对象的三种方法
// 1.1直接通过类名.class的方式得到
Class clazz = null;
clazz = Person.class;
Field[] fields = clazz.getDeclaredFields();
System.out.println(clazz); // 2.1通过对象调用getClass()方法来获取
Person person = new Person();// Object obj =new Person();
clazz = person.getClass(); // clazz = obj.getClass(); // 3.1通过全类名的方式获取,用的最多的
String className = "com.shellway.test.Person";
clazz = Class.forName(className);
}
}

ReflectionTest类

 利用反射写一个晚会案例:

 Singing=com.shellway.Reflection.impl.Liudehua
Dancing=com.shellway.Reflection.impl.Guofucheng
Xiangsheng=com.shellway.Reflection.impl.Guodegang

party.properties

 package com.shellway.Reflection;

 import com.shellway.Reflection.imp.Dancing;
import com.shellway.Reflection.imp.Singing;
import com.shellway.Reflection.imp.Xiangsheng; public class EveningParty {
public static void main(String[] args) throws Exception {
System.out.println("晚会开始!!!!!");
//唱歌
Singing sing = Factory.getSinger();
sing.singing();
//跳舞
Dancing dancing = Factory.getDancer();
dancing.dancing();
//相声
Xiangsheng xiangsheng = Factory.getPerformer();
xiangsheng.show();
System.out.println("晚会结束!!!!!");
}
}

EveningParty.java

 package com.shellway.Reflection.imp;

 public interface Singing {
public void singing();
}

Singing 接口

 package com.shellway.Reflection.imp;

 public interface Dancing {
void dancing();
}

Dancing 接口

 package com.shellway.Reflection.imp;

 public interface Xiangsheng {
void show();
}

Xiangsheng 接口

接口实现类:

 package com.shellway.Reflection.impl;

 import com.shellway.Reflection.imp.Singing;

 public class Liudehua implements Singing {

     @Override
public void singing() {
System.out.println("刘德华演唱:中国人");
}
}

歌手刘德华

 package com.shellway.Reflection.impl;

 import com.shellway.Reflection.imp.Singing;

 public class Xietingfeng implements Singing {

     @Override
public void singing() {
System.out.println("谢霆锋演唱:因为爱所以爱...");
}
}

歌手谢霆锋

 package com.shellway.Reflection.impl;

 import com.shellway.Reflection.imp.Dancing;

 public class Yangliping implements Dancing {

     @Override
public void dancing() {
System.out.println("杨丽萍表演孔雀舞...");
}
}

舞者杨丽萍

 package com.shellway.Reflection.impl;

 import com.shellway.Reflection.imp.Dancing;

 public class Guofucheng implements Dancing {

     @Override
public void dancing() {
System.out.println("郭富城跳广场舞...");
}
}

舞者郭富城

 package com.shellway.Reflection.impl;

 import com.shellway.Reflection.imp.Xiangsheng;

 public class Guodegang implements Xiangsheng {

     @Override
public void show() {
System.out.println("郭德纲表演相声...");
}
}

相声演员郭德纲

工厂类与配置文件结合实现反射

 package com.shellway.Reflection;

 import java.util.ResourceBundle;

 import com.shellway.Reflection.imp.Dancing;
import com.shellway.Reflection.imp.Singing;
import com.shellway.Reflection.imp.Xiangsheng; public class Factory { public static Singing getSinger() throws Exception{
String pathName = ResourceBundle.getBundle("party").getString("Singing");
Object obj = Class.forName(pathName).newInstance();
return (Singing) obj;
}
public static Dancing getDancer() throws Exception{
String pathName = ResourceBundle.getBundle("party").getString("Dancing");
Object obj = Class.forName(pathName).newInstance();
return (Dancing) obj;
} public static Xiangsheng getPerformer() throws Exception{
String pathName = ResourceBundle.getBundle("party").getString("Xiangsheng");
Object obj = Class.forName(pathName).newInstance();
return (Xiangsheng) obj;
} }

Factory

复习java基础第七天(反射)的更多相关文章

  1. Java实习生常规技术面试题每日十题Java基础(七)

    目录 1. Java设计模式有哪些? 2.GC是什么?为什么要有GC? 3. Java中是如何支持正则表达式. 4.比较一下Java和JavaSciprt. 5.Math.round(11.5) 等于 ...

  2. JAVA基础 (二)反射 深入解析反射机制

    在谈论到反射这个问题时,你是否有例如以下疑问? 不管是在.NET还是Java中反射的原理和机制是一样的,理解了一种还有一种就能够迎刃而解,想要理解反射首先须要了解底层的一些概念和执行.理解了反射有助于 ...

  3. java基础篇3之反射

    1.反射的基础 反射的基石---->Class类 java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class 获取字节码对应的实例对象(Class类型) class ...

  4. 【Java基础】RTTI与反射之Java

    一.引言 很多时候我们的程序可能需要在运行时识别对象和类的信息,比如多态就是基于运行时环境进行动态判断实际引用的对象.在运行时识别对象和类的信息主要有两种方式:1.RTTI,具体是Class对象,它假 ...

  5. JAVA基础知识之JVM-——使用反射生成并操作对象

    Class对象可以获取类里的方法,由Method对象表示,调用Method的invoke可以执行对应的方法:可以获取构造器,由Constructor对象表示,调用Constructor对象的newIn ...

  6. JAVA基础知识之JVM-——通过反射查看类信息

    Class实例 当类被加载之后,JVM中就会生成一个Class实例,通过这个实例就可以访问JVM中的这个类.有三种方式可以获取Class对象 使用Class的静态方法forName(完整包名) 调用类 ...

  7. Java 基础【18】 反射与内省

    1.概念定义 Java 反射机制(Reflect)容许程序在运行时加载.探知.使用编译期间完全未知的 class,核心类 java.lang.Class. 通过把指定类中各种元素映射成 java.la ...

  8. java基础强化——深入理解反射

    目录 1.从Spring容器的核心谈起 2. 反射技术初探 2.1 什么是反射技术 2.2 类结构信息和java对象的映射 3 Class对象的获取及需要注意的地方 4. 运行时反射获取类的结构信息 ...

  9. Java基础(十三)反射

    一.反射 1.反射概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的 ...

随机推荐

  1. 33.bucket与metric核心概念讲解

    主要知识点: bucket与metric核心慨念 一.核心慨念 1.bucket:一个数据分组 比如有下面几条数据: city name 北京 小李 北京 小王 上海 小张 上海 小丽 上海 小陈   ...

  2. [数据结构]C#顺序表的实现

    在数据结构的学习当中,想必C++可能是大家接触最多的入门语言了 但是C#的数据结构却很少看到,今天我写了一个C#顺序表的顺序存储结构 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是 ...

  3. xth的第 12 枚硬币(codevs 1366)

    题目描述 Description 传说 xth 曾经拥有11枚完全相同硬币(你懂得),不过今年呢,rabbit又送了他一 枚硬币.这枚硬币和其他硬币外观相同,只有重量不同,或轻或重.Xth 一不小心, ...

  4. 树 (p155, 从中序和后续回复二叉树)

    递归求解, You are to determine the value of the leaf node in a given binary tree that is the terminal no ...

  5. v$open_cursor中的相同record

    之前在查看v$open_cursor的时候,发现很多相同的record. 让我很疑惑, sid saddr sql_id 都相同,我就想 这不是一个cursor吗? 那为什么在open_cursor中 ...

  6. 机器学习10k均值

    下面介绍无监督机器学习算法,与前面分类回归不一样的是,这个不知道目标变量是什么,这个问题解决的是我们从这些样本中,我们能发现什么. 这下面主要讲述了聚类算法,跟数据挖掘中的关联挖掘中的两个主要算法. ...

  7. [vagrant]第一次安装添加box出现问题汇总

    1.本地文件要加全文件名和协议file:/// 2.The box failed to unpackage properly. Please verify that the box file you' ...

  8. 关于压缩软件gzip和xz的简单对照

    晚上因为处理磁盘报警的须要.进行了日志压缩,在此次压缩中分别使用了gzip和xz软件对文本进行了压缩.压缩的结果很令人诧异. 出于对xz好奇的原因是因为在下载内核源码时常常能够看到.xz格式的文件包. ...

  9. HDU 4532

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  10. 【Java集合源代码剖析】Hashtable源代码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36191279 Hashtable简单介绍 Hashtable相同是基于哈希表实现的,相同每 ...