1:什么是反射机制?

2:反射机制它可以做什么呢?  

3:反射机制对应的API又是什么?

1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名;

2):实例化Class对象

3):获取对象的父类与实现的接口

4):获取类中的所有的方法或者单个方法

5):使用反射调用方法 && 使用反射调用静态方法

6):使用反射调用数组参数

7):使用反射,动态拷贝数组

7):获取一个类中所有的构造器,获取单个不带参数的构造器,获取带参数的构造器

8):使用反射调用构造器---->创建对象

9):动态加载资源文件

1.什么是反射机制

反射机制是在运行状态中,对于任意一个类,都能够知道类所有的属性和方法,对于任意一个对象,

都能调用它的方法和属性,这种动态获取方法和属性,动态调用方法和属性的功能,称为Java的反射机制。

2.反射机制它可以做什么

反射机制主要提供以下功能:

1:在运行时,判断任意一个对象所属的类 。

2:在运行时,构造任意一个类的对象。

3:在运行时,判断任意一个类所具有的成员变量和方法。

4:在运行时,任意调用一个类中的方法。

5:生成动态代理。

5.反射机制对应的API又是什么

通过一个对象来获取一个对象的全限定名称(完整包名)

包名:Classinstance 类名:MethodD

private static void GetName() {
Class claz=MethodD.class;//获取对象的类
String classname=claz.getName();
System.out.println(classname);//打印出:Classinstance.MethodD
}

实例化Class对象

package net.xsoftlab.baike;
public class TestReflect {
public static void main(String[] args) throws Exception {
Class<?> class1 = null;
Class<?> class2 = null;
Class<?> class3 = null;
// 一般采用这种形式
class1 = Class.forName("net.xsoftlab.baike.TestReflect");
class2 = new TestReflect().getClass();
class3 = TestReflect.class;
System.out.println("类名称 " + class1.getName());
System.out.println("类名称 " + class2.getName());
System.out.println("类名称 " + class3.getName());
}
}

获取对象的父类与实现的接口

package Classinstance;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable; //获取父类和实现的接口
public class GetparentAndInterface implements Serializable,ActionListener { public static void main(String[] args) {
Class<?> claz=GetparentAndInterface.class;//获取对象
//获取父类
//返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
Class<?>parent=claz.getSuperclass();
System.out.println(parent);//打印父类:class java.lang.Object
//获取该类中所有的实现接口
// getInterfaces()确定此对象所表示的类或接口实现的接口。
Class<?>[] InterFace=claz.getInterfaces();
for (Class<?> class1 : InterFace) {
System.out.println(class1);
} } public void actionPerformed(ActionEvent e) { } }

使用反射来调用方法

package Classinstance;

import java.lang.reflect.Method;

//使用反射调用方法
class InvokeClass {
public void methodOne() {
System.out.println("调用不带参数的方法!");
} public void methodTwo(String name) {
System.out.println("调用带一个参数的方法!" + name);
} private String methodThree(String name, int age) {
System.out.println("调用私有带两个参数的方法!" + name + "," + age);
return name + "," + age;
}
} public class MethodInvokeDemo {
public static void main(String[] args) throws Exception {
//获取类对象
Class<InvokeClass> clazz = InvokeClass.class;
//获取方法
Method md = clazz.getMethod("methodOne");
Object dowork = md.invoke(clazz.newInstance());//invoke();
System.out.println(dowork); //调用带参数的方法
Method md1 = clazz.getMethod("methodTwo", String.class);
Object dowork1 = md1.invoke(clazz.newInstance(), "张三");//invoke();
System.out.println(dowork1); //调用私有带两个参数的方法
Method md2 = clazz.getDeclaredMethod("methodThree", String.class, int.class);
md2.setAccessible(true);//设置可访问的私有成员
Object dowork2 = md2.invoke(clazz.newInstance(), "张三", 18);//invoke();
System.out.println(dowork2); //使用反射调用静态方法
        Method md3 = clazz.getDeclaredMethod("methodThree", String.class, int.class);
        md3.setAccessible(true);//设置可访问的私有成员
        Object dowork3 = md3.invoke(null, "张三", 18);//invoke();
        System.out.println(dowork3);
}
}

使用反射来调用数组参数(情况1:数组元素类型数基本类型  情况2:数组元素类型是引用类型)

package Classinstance;

import java.lang.reflect.Method;
import java.util.Arrays; class Method2 {
public static void dowork(int[] arr) {
System.out.println("dowork被调用了" + Arrays.toString(arr));
} public static void dowork2(String[] arr) {
System.out.println("dowork2被调用了" + Arrays.toString(arr));
}
} public class MethodInvokeDemo2 {
//使用反射调用数组参数(可变参数)
public static void main(String[] args) throws Exception {
Class<Method2> clazz = Method2.class;
//情况1:数组元素类型数基本类型
Method md = clazz.getMethod("dowork", int[].class);
//md.invoke(null, 1,2,3,4,5,6);error
//Object dw=md.invoke(null, new int[]{1,2,3,4,5,6});
Object dw = md.invoke(null, new Object[] { new int[] { 1, 2, 3, 4, 5, 6 } });
System.out.println(dw);
//情况2:数组元素类型是引用类型
Method md1 = clazz.getMethod("dowork2", String[].class);
//md.invoke(null, new String[]{"a","b","c"});error
Object dw1 = md1.invoke(null, new Object[] { new String[] { "a", "b", "c" } });
System.out.println(dw1);
}
}

使用反射机制,动态拷贝数组

package Classinstance;

import java.lang.reflect.Array;
import java.util.Arrays; //使用反射机制,动态拷贝数组
public class ArrayDemo {
public static void main(String[] args) {
int[] src = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int[] dest = new int[10];
System.out.println(Arrays.toString(src));
Arraycopy(src, 2, dest, 3, 5);
System.out.println(Arrays.toString(dest));
} public static void Arraycopy(Object src, int srcPos, Object dest, int destPos, int length) {
//源数组和目标数组必须是数组类型
if (!src.getClass().isArray() || !dest.getClass().isArray()) {
throw new ArrayStoreException("源数组和目标数组不是数组类型");
}
//源数组和目标数组不能为null
if (src == null || dest == null) {
throw new NullPointerException("源数组和目标数组不能为null");
}
//源数组和目标数组的数组类型必须一致
if (src.getClass().getComponentType() != dest.getClass().getComponentType()) {
throw new ArrayStoreException("源数组和目标数组元素类型不一致");
}
//源数组和目标数组不想索引越界
if (srcPos < 0 || destPos < 0 || length < 0 || srcPos + length > Array.getLength(src)
|| destPos + length > Array.getLength(dest)) {
throw new IndexOutOfBoundsException("索引越界");
}
//获取需要拷贝的元素
for (int index = srcPos; index < srcPos + length; index++) {
//给目标数组数组元素
Object val = Array.get(src, index);
Array.set(dest, destPos, val);
destPos++;
}
}
}

获取类中的所有的方法或者单个方法

package Classinstance;

import java.lang.reflect.Method;

class MethodD {
public void method1() { } public void method2(String name) {
} private String method3(String name, int age) {
return name + "," + age;
}
} public class GetMethodDemo { private static GetMethodDemo class2; //使用反射获取类中的方法
public static void main(String[] args) throws Exception {
getAll();
getOne();
GetName();
} //通过一个对象来获取一个对象的全限定名称(完整包名)
private static void GetName() {
Class claz = MethodD.class;//获取对象的类
String classname = claz.getName();
System.out.println(classname);//打印出:Classinstance.MethodD
} //获取类中的指定的一个方法
private static void getOne() throws Exception {
Class<MethodD> clasz = MethodD.class;
//获取类不带参数的方法
Method md = clasz.getMethod("method1");
//获取类中指定带一个参数的方法
Method md1 = clasz.getMethod("method2", String.class);
//获取类私有指定带两个参数的方法
Method md2 = clasz.getDeclaredMethod("method3", String.class, int.class);
System.out.println(md2);
} private static void getAll() {//获取类中的所有方法
Class<MethodD> clasz = MethodD.class;
/*
* 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,
* 包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
*/
Method[] md = clasz.getDeclaredMethods();
System.out.println(md.length);
for (Method method : md) {
System.out.println(method);
} } }

获取一个类中所有的构造器,获取单个不带参数的构造器,获取带参数的构造器

package Classinstance;

import java.lang.reflect.Constructor;

class User {
public User() { } public User(String name) { } private User(String name, int age) { }
} //获取构造器
public class GetConstructor {
public static void main(String[] args) throws Exception {
getAll();
} //获取所有构造器
private static void getAll() throws Exception {
//1):获取构造器所在类的对象
Class<User> claz = User.class; //2):获取对象中的所有构造器
Constructor<?>[] con = claz.getConstructors();//getConstructors()获取类中带public的构造器,返回一个Constructors数组
for (Constructor<?> constructor : con) {
System.out.println(constructor);
}
Constructor<?>[] con1 = claz.getDeclaredConstructors();//getDeclaredConstructors()获取类中带所有的构造器,跟访问权限无关,返回一个Constructors数组
for (Constructor<?> constructor : con1) {
System.out.println(constructor);
}
//获取public User()的构造器
Constructor<User> con2 = claz.getConstructor();
System.out.println(con2);
// 获取public User(String name)的构造器
//注意:必须用getDeclaredConstructor();有访问权限才可以
Constructor<User> con3 = claz.getDeclaredConstructor(String.class, int.class);
System.out.println(con3);
}
}

使用反射调用构造器---->创建对象

package Classinstance;

//使用反射调用构造器-->创建对象
import java.lang.reflect.Constructor; class Peson {
public Peson() {
System.out.println("无参数构造器");
} public Peson(String name) {
System.out.println("有参数构造器" + name);
} private Peson(String name, int age) {
System.out.println("有参数构造器" + name + "," + age);
}
} public class CteateObject {
public static void main(String[] args) throws Exception {
Cteate();
} public static void Cteate() throws Exception {
//获取构造器对象
Class<Peson> clasz = Peson.class;
Constructor<?> con1 = clasz.getDeclaredConstructor();
Constructor<?> con2 = clasz.getDeclaredConstructor(String.class);
Constructor<?> con3 = clasz.getDeclaredConstructor(String.class, int.class);
//创建对象
con2.newInstance("张三");//newInstance();创建此 Class 对象所表示的类的一个新实例
//设置构造器可以访问
con3.setAccessible(true);
con3.newInstance("李四", 15);
}
}

动态加载资源文件

package Classinstance;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; //动态加载资源文件
public class LoadResourceDemo {
public static void main(String[] args) throws Exception {
text1();
text2();
} //最好用的方法
private static void text2() throws Exception {
Properties p = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream inStream = loader.getResourceAsStream("db.properties");
p.load(inStream);
System.out.println(p);
} private static void text1() throws Exception {
//一般方式
Properties p = new Properties();
InputStream inStream = new FileInputStream("file/db.properties");//
p.load(inStream);
System.out.println(p);
} }

Java 核心类库之反射机制的更多相关文章

  1. Java进阶之reflection(反射机制)——反射概念与基础

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  2. Java基础学习笔记二十三 Java核心语法之反射

    类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化. 加载就是指将class文件读入内存,并为之创建一个Class对象.任 ...

  3. Java SE之初探反射机制

    [Keywords]:Java,Hibernate,虚拟机,框架,SQL [Abstract]:   反射的概念:所谓的反射就是java语言在运行时拥有一项自观的能力,反射使您的程序代码能够得到装载到 ...

  4. java的RTTI和反射机制

    RTTI,即Run-Time Type Identification,运行时类型识别.RTTI能在运行时就能够自动识别每个编译时已知的类型. 很多时候需要进行向上转型,比如Base类派生出Derive ...

  5. java.lang.Class<T> -- 反射机制

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

  6. 在JAVA中,关于反射机制的讨论

    一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...

  7. java工厂类与反射机制

    java 简单工厂类 2012-04-22 15:44:07|  分类: java |  标签:java工厂类  简单工厂类  |举报|字号 订阅     简单工厂模式需要由以下角色组成: 接口    ...

  8. JAVA(五)反射机制/Annotation

    成鹏致远 | lcw.cnblog.com |2014-02-04 反射机制 1.认识Class类 在正常情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在 java中也允许通过一个对象来找 ...

  9. java的泛型与反射机制

    什么是泛型? 泛型,即“参数化类型”.顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参) ...

随机推荐

  1. 洛谷 1291 [SHOI2002]百事世界杯之旅

    题目:https://www.luogu.org/problemnew/show/P1291 大水题!套路!模板! 稍微注意一下输出就行了. #include<iostream> #inc ...

  2. Android三种左右滑动效果 手势识别(转)

    本示例演示在Android中实现带渐显按钮的左右滑动效果. 关于滑动效果,在我的上一篇博文中提到过,有兴趣的朋友可以访问: http://www.cnblogs.com/hanyonglu/archi ...

  3. maven编译问题:maven编译成功,eclipse文件未编译

    我们先来看一个正常的编译流程: 1.从svn上检出一个项目: 2.看该工程是否为maven项目,不是则先转为maven项目:右键单击项目,选择configure->Convert to Mave ...

  4. ubuntu14.04安装pyspider

    sudo apt-get install libcurl4-openssl-dev libxml2-dev libxslt1-dev sudo atp-get install phantomjs 激活 ...

  5. pt工具之pt-archiver

    # tar -zxvf percona-toolkit-2.2.17.tar.gz# yum -y install perl perl-IO-Socket-SSL perl-DBD-MySQL per ...

  6. mysql 内存体系结构--session

    体系结构tmp_table_size & max_heap_table_size ,这个是会话级的内存结构mysql使用总内存 = global_buffers + thread_buffer ...

  7. 实验吧CTF题库-隐写术(部分)

    Spamcarver 用kali下载图片 root@sch01ar:~# wget http://ctf5.shiyanbar.com/stega/spamcarver/spamcarver.jpg ...

  8. windows下使用nginx

    本文介绍如何在windows下使用nginx 起步 下载安装 将nginx安装成windows服务 常用命令 构建服务 静态服务 代理服务器 http配置文件转移 负载均衡 负载均衡配置 负载均衡方法 ...

  9. springboot成神之——spring的文件上传

    本文介绍spring的文件上传 目录结构 配置application DemoApplication WebConfig TestController 前端上传 本文介绍spring的文件上传 目录结 ...

  10. windows下配置非安装版的MySQL5.6

    Installing MySQL on Microsoft Windows Using a noinstall Zip Archive,在Windows上使用非安装压缩包安装MySQL.安装步骤如下: ...