一:目标

Ø理解 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. 公钥基本结构(PKI)的概念

    公钥证书 ,通常简称为证书 ,用于在 Internet.Extranet 和 Intranet 上进行身份验证并确保数据交换的安全.证书的颁发者和签署者就是众所周知的 证书颁发机构 (CA),将在下一 ...

  2. 【ACM】nyoj_14_会场安排问题_201308151955

    会场安排问题时间限制:3000 ms  |  内存限制:65535 KB 难度:4描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就是安 ...

  3. asp.net--解决上传文件大小限制

    原文地址 第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRuntime节点 对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大 ...

  4. [poj1363]Rails_模拟_栈

    Rails poj-1363 题目大意:判断一个序列是否是1~n的合法出栈序列. 注释:$1\le n\le 10^4$. 想法:开始想到一种想法. 对于一段序列来讲,显然从首元素开始的连续小于尾元素 ...

  5. Navicat 提示Cannot create oci environment 解决方式

    一直在使用Navicat,这是一个数据库client软件.能连接多种不同类型的数据库,给我们的日常的工作带来了不少的便捷.近期.我在电脑上安装了orcale,然后,Navicat就莫名其妙的不能连接o ...

  6. HTML文档基础

    一.HTML(Hyper Text Markup Language超文本标记语言)是一种用来制作超文本文档的简单标记语言,HTML在正文的文本中编写各种标记,通过Web浏览器进行编译和运行才干正确显示 ...

  7. C# openfiledialog对文本框的操作//C#中OpenFileDialog的使用

    在WebForm中提供了FileUpload控件来供我们选择本地文件,只要我们将该控件拖到页面上了,就已经有了选择本地文件的功能了.而在WinForm中,并没有为我们提供集成该功能的控件,但为我们提供 ...

  8. hdu 2063 (二分匹配 匈牙利算法)

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. 91. ExtJS获取父子、兄弟容器元素方法

    转自:https://blog.csdn.net/u014745818/article/details/44957341 1 1.当前对象的父对象(上级对象) this.ownerCt: 2.当前对象 ...

  10. CAS配置记录

    CAS配置(1)之证书配置 CAS配置(2)之主配置 CAS配置(3)之restful-api接入接口