反射的基本原理:反射的机制是通过类加载器将字节码文件读入到内存中,然后通过解析器在内存中解析出这个类的所有东西,当我们需要用到的时候我们可以拿出来使用。

一、反射一个类的构造函数

person类
package com.cn.ljh.reflect;

public class Person {

	private String name;
private int age;
//无参构造函数
public Person(){
System.out.println("无参构造函数");
}
//一个参数的构造函数
public Person(String name){
this.name = name;
System.out.println("一个参数构造函数"+name);
} //两个构造函数
public Person(String name,int age){
this.name = name;
this.age = age;
System.out.println(name+"="+age);
} //私有构造函数
private Person(int age){
this.age = age;
System.out.println("私有的构造函数"+age);
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} }
反射person类中的构造函数基本操作
package com.cn.ljh.reflect;

import java.lang.reflect.Constructor;

/**
* 通过反射获取构造函数
* @author lijunhong
*
*/
public class Test1 { public static void main(String[] args) throws Exception {
// test1();
// test2();
// test3();
test4();
} //获取字节码文件的三种方式
public static void test() throws Exception{
//1.通过类的全名获取
Class clas = Class.forName("com.cn.ljh.reflect.Person");
//2.通过类名获取
Class p = Person.class;
//3.通过对象获取
Person person = new Person();
Class cl = person.getClass();
} //通过反射获取无参构造函数(可以使用上面三种方式获取字节码)
public static void test1() throws Exception{
//获得(Person)字节码文件
Class clas = Class.forName("com.cn.ljh.reflect.Person");
//得到无参构造函数
Constructor con = clas.getConstructor(null);
//通过无参构造函数创建实例
Person persong = (Person) con.newInstance(null);
} //通过反射获取带一个参数的构造函数
public static void test2() throws Exception{ //获得(Person)字节码文件
Class clas = Person.class;
//得到有一个参数的构造函数
Constructor con = clas.getConstructor(String.class);
//创建带有一个参数的构造函数的实例
Person p = (Person) con.newInstance("张三");
} //通过反射获取带有两个参数的构造函数
public static void test3() throws Exception{
Class clas = Class.forName("com.cn.ljh.reflect.Person");
Constructor con = clas.getConstructor(String.class,int.class);
con.newInstance("李白",100);
} //通过反射获取私有的构造函数
public static void test4() throws Exception{
Class clas = Class.forName("com.cn.ljh.reflect.Person");
//获取私有的构造函数
Constructor con = clas.getDeclaredConstructor(int.class);
con.setAccessible(true);//这里设置为true获得私有方法
con.newInstance(100);
}
}

二、反射一个类的方法

person2类
package com.cn.ljh.reflect;

public class Person2 {

	private String name;
private int age; public Person2(){ } public void eat1(){
System.out.println("无参,无返回值方法");
} public void eat2(String food,String toos){
System.out.println("用"+toos+"(有参,无返回值)吃"+food);
} public String eat3(){
return "返回值方法";
} private void eat4(){ System.out.println("私有方法(无返回值,无参数)");
} public static void main(String[] args){
System.out.println("main函数");
for(String s:args){
System.out.println(s);
}
} }
反射person2类中的方法基本操作
package com.cn.ljh.reflect;

import java.lang.reflect.Method;

/**
* 通过反射获取方法
* @author lijunhong
*
*/
public class Test2 { public static void main(String[] args) throws Exception {
// test1();
// test2();
// test3();
// test4();
test5();
} //反射无参无返回值方法
public static void test1() throws Exception{
//获取(Person1)字节码文件
Class clas = Class.forName("com.cn.ljh.reflect.Person2");
//通过无参构造函数创建对象
Person2 p = (Person2) clas.newInstance();
//获得方法(通过方法名字和参数反射)
Method m = clas.getMethod("eat1", null);
//通过对象和参数调用方法
m.invoke(p, null);
} //反射有参无返回值方法(多参数)
public static void test2() throws Exception{
Class clas = Class.forName("com.cn.ljh.reflect.Person2");
Person2 p = (Person2) clas.newInstance();
Method m = clas.getMethod("eat2", String.class,String.class);
m.invoke(p, "香蕉","手");
} //反射有返回值方法
public static void test3() throws Exception{
Class clas = Class.forName("com.cn.ljh.reflect.Person2");
Method m = clas.getMethod("eat3", null);
Person2 p = (Person2) clas.newInstance();
String value = (String) m.invoke(p, null);
System.out.println(value);
} //反射私有方法
public static void test4() throws Exception{
Class clas = Class.forName("com.cn.ljh.reflect.Person2");
Method m = clas.getDeclaredMethod("eat4", null);
Person2 p = (Person2) clas.newInstance();
//设置true得到私有方法
m.setAccessible(true);
m.invoke(p, null);
} //反射main方法
public static void test5() throws Exception{
Class clas = Class.forName("com.cn.ljh.reflect.Person2");
Method m = clas.getMethod("main", String[].class);
Person2 p = (Person2) clas.newInstance();
//将String数组封装成Object数组,使其Object中只有一个元素,
//否则main方法会将其拆成两个参数,而不是一个数组元素
//还可以直接封装成object类型的
// m.invoke(p,new Object[]{(new String[]{"1","2"})});
//封装成object类型的
m.invoke(p, (Object) new String[]{"1","2"});
} }

三、反射一个类的字段(成员变量)

student类
package com.cn.ljh.reflect;

public class Student {

	private String name;
public int age;
private static int grade; public Student(){ } public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static int getGrade() {
return grade;
}
public static void setGrade(int grade) {
Student.grade = grade;
} }
反射一个类的字段的基本操作
package com.cn.ljh.reflect;

import java.lang.reflect.Field;

/**
* 通过反射获取字段
* @author lijunhong
*
*/
public class Test3 { public static void main(String[] args) throws Exception {
// test1();
test2();
// test3();
} //获取私有字段(同时操作name字段)
public static void test1() throws Exception{
//获得student字节码文件
Class clas = Class.forName("com.cn.ljh.reflect.Student");
//获得字段
Field f = clas.getDeclaredField("name");
//设置true拿到私有成员
f.setAccessible(true);
//创建对象
Student s = (Student) clas.newInstance();
//设置name的值
f.set(s, "张三");
//获得name的值
String name = (String) f.get(s);
System.out.println(name);
} //获取公共的字段(同时操作age字段)
public static void test2() throws Exception{
Class clas = Class.forName("com.cn.ljh.reflect.Student");
Student s = (Student) clas.newInstance();
Field f = clas.getField("age");
f.set(s, 12);
System.out.println(f.get(s));
} //获取私有的静态字段(同时操作grade字段)
public static void test3() throws Exception{
Class clas = Class.forName("com.cn.ljh.reflect.Student");
Student s = (Student) clas.newInstance();
s.getGrade();
s.setGrade(12);
} }

记录学习的每一步,记录每一次的成长!!!!

java反射基本使用操作的更多相关文章

  1. Java反射机制小结和实际操作

    一.什么是反射 1.编译和运行 在了解什么是Java反射机制前,先聊聊Java的编译和运行. 还记得第一次使用记事本编写第一个Java程序的场景吗?通过命令窗口,使用javac命令编译一个.java文 ...

  2. Java反射机制demo(六)—获得并操作一个类的属性

    Java反射机制demo(六)—获得并操作一个类的属性 获得并操作一个类的属性?! 不可思议啊,一个类的属性一般都是私有成员变量啊,private修饰符啊! 但是毫无疑问,这些东西在Java的反射机制 ...

  3. 乐字节Java反射之四:反射相关操作

    大家好,乐字节小乐继续为Java初学者讲述Java基础知识.上次说到乐字节Java反射之三:方法.数组.类加载器,这次是Java反射之四:反射相关操作 1.操作属性 //1.获取Class对象 Cla ...

  4. Java反射----数组操作

    1,获取数组字段 在Person类中定义了一个一维数组字段:int[] a1 = new int[]{1,2,3}; 如何通过反射技术来操作该字段? 补充:Java操作数组主要用的是Array类. @ ...

  5. Java反射之对JavaBean的内省操作

    上一篇我们说了Java反射之数组的反射应用 这篇我们来模拟实现那些javabean的框架(BeanUtils)的基本操作. [一] 什么是JavaBean JavaBean 是一种JAVA语言写成的可 ...

  6. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  7. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  8. java基础知识(十一)java反射机制(下)

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

  9. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

随机推荐

  1. [WP8.1UI控件编程]Windows Phone大数据量网络图片列表的异步加载和内存优化

    11.2.4 大数据量网络图片列表的异步加载和内存优化 虚拟化技术可以让Windows Phone上的大数据量列表不必担心会一次性加载所有的数据,保证了UI的流程性.对于虚拟化的技术,我们不仅仅只是依 ...

  2. 【Java】RuleSource约束常用方法整理

    1-常用约束规则RuleSource的设置方法   例如: addRules(new Rules(ProgramFeeItem.class){ protected void initRules() { ...

  3. JS引用另外JS文件的顺序问题。

    1.在a.js中可以引用b.js文件,这样就可以在网页中只引用a.js文件,从而可以使用a.js和b.js文件中的所有方法. 引用格式如下:document.write('<script typ ...

  4. 可能碰到的iOS笔试面试题(4)--C语言

    可能碰到的iOS笔试面试题(4)--C语言 可能碰到的iOS笔试面试题(4)--C语言 C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的 ...

  5. javascript问题积累

    今天在写网页时碰到了几个js可以解决的小问题,很好用,很简便 1.鼠标移动到图片上时可更换图片,比如用到给图片加颜色,去颜色. <img src="../img/02.gif" ...

  6. Qt 按钮事件不响应

    在Qt中,我们设置好按钮的相应事件,连好信号槽,声明什么的也没什问题,但为什么点击按钮就是没有反应,检查了半天终于发现原来是子面板上也有一个相同名称的按钮,一般来说两个面板不为父子关系的时候,分别在不 ...

  7. [LintCode] Toy Factory 玩具工厂

    Factory is a design pattern in common usage. Please implement a ToyFactory which can generate proper ...

  8. [LintCode] Mini Twitter 迷你推特

    Implement a simple twitter. Support the following method: postTweet(user_id, tweet_text). Post a twe ...

  9. linux查看主机端口进程命令

    1.查看主机信息 # more /etc/hosts # Do not remove the following line, or various programs # that require ne ...

  10. window svn backup.bat

    help command /? call /? %cd% 可以用在批处理文件中,也可以用在命令行中:展开后,是驱动器盘符:+当前目录,如在dos窗口中进入c:\dir目录下面, %0代指批处理文件自身 ...