java - day019 - 反射
网络程序,难点在线程
- 反射 reflect
- 实用 类对象 来执行反射操作
- 反射获得一个类的定义信息
- 反射创建对象
- 反射调用成员变量, 方法
- 方法
- 获得类对象的三种方式
- A.class
- Class.forName("完整类名");
- a1.getClass();
- 类对象的方法
- c.getPackage().getName();
- c.getName();
- c.getSimpleName();
- 获得成员变量的定义信息
- getFields(); 得到可见的成员变量,即能访问的, 包括继承来的
- getDeclaredFields(); 本类定义的所有变量, 包括私有变量, 不包括继承的
- getField(变量名); 得到单个可见的的成员变量
- getDeclaredField(变量名);
- 获得构造方法的定义信息
- getConstructors(); 获得可见的构造方法,
- getDeclaredConstructors(); 获得所有的构造方法
- getConstructor(参数类型列表); 获得单个可见的的构造方法
- getDeclaredConstructor(int.class,String.class);
- 获得方法的定义信息
- getMethods(); // 可见的方法, 包括继承的方法
- getDeclaredMethods(); // 本类定义的方法, 包括私有的方法,不包括继承的方法
- getMethod(方法名,参数类型列表);
- getDeclaredMethod(方法名,int.class,String.class);
package day1901_反射; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Scanner; public class Test1 {
public static void main(String[] args) throws Exception { System.out.println("输入完整类名"); String s = new Scanner(System.in).nextLine(); // 获得这个类的'类对象' Class<?> c = Class.forName(s); // 获得包名, 类名 ,简写类名
String p = c.getPackage().getName();
String n = c.getName();
String sn = c.getSimpleName();
System.out.println(p);
System.out.println(n);
System.out.println(sn); System.out.println("----成员变量------");
f1(c); System.out.println("----构造方法------");
f2(c); System.out.println("----方法------");
f3(c); } private static void f3(Class<?> c) {
/*
* Method 对象, 封装方法的定义信息
* public static void f(int i , String s)throws X,Y,Z
*/
Method[] a = c.getDeclaredMethods();
for (Method f : a) {
String n = f.getName();
// 构造方法参数的类型 (int.class, String.class);
Class<?>[] p = f.getParameterTypes();
System.out.println(n+"("+Arrays.toString(p)+")");
}
} private static void f2(Class<?> c) {
/*
* Constructor 构造方法的封装对象
*
* public A(int a, String s) throws X,Y,Z
*
*/
Constructor<?>[] a = c.getConstructors();
for (Constructor<?> t : a) {
String n = c.getSimpleName();
// 构造方法参数的类型 (int.class, String.class);
Class<?>[] p = t.getParameterTypes();
System.out.println(n+"("+Arrays.toString(p)+")");
}
} private static void f1(Class<?> c) {
/*
* Field对象
* 封装了成员变量的定义信息
*
*/
Field[] a = c.getDeclaredFields();
for (Field f : a) { System.out.println(f.getType().getSimpleName()+f.getName());
} }
}
- 反射新建对象
- 通过 类对象 的反射操作
- 执行 无参构造 方法
- object obj = c.newInstabce();
- 执行有参构造
- 先获得构造方法
- Constructor t = c.getConstructor(int.class,String.class);
- 通过构造方法的反射操作, 来新建对象
- object obj = t.newInstance(int ,String);
package day1901_反射; import java.lang.reflect.Constructor;
import java.util.Scanner; public class Test2 {
public static void main(String[] args) throws Exception { System.out.println("输入类名");
String s = new Scanner(System.in).nextLine();
Class<?> c = Class.forName(s);
Object o1 = null;
Object o2 = null; /*
* 新建 o1,执行无参构造
* 新建 o2,执行有参构造
*/ try {
o1 = c.newInstance();
System.out.println("o1:"+o1);// 默认执行 o1 的toString
} catch (Exception e) {
// TODO: handle exception
System.out.println("o1: 不能执行无参构造");
} System.out.println("-----------------------------"); try {
Constructor<?> t = c.getConstructor(int.class);
o2 = t.newInstance();
System.out.println("o2: "+o2);
} catch (Exception e) {
// TODO: handle exception
System.out.println("o2: 不能执行int参数构造方法");
} }
}
- 反射调用成员变量,
- 获得成员变量
- Field f = c.getDeclaredField("age");
- 使私有变量也可以访问,
- f.setAccssible(true);
- 赋值
- f.set(对象,21);给指定对象的变量赋值
- 取值
- int i = (int)f.get(对象);
package day1901_反射; import java.lang.reflect.Field; import day0802.Student; /*
* 跨项目不能直接访问,需要项目关联
* 左侧选中需要关联项目的项目,右键弹出选中build path 选中项目project,
*/
public class Test3 {
public static void main(String[] args) throws Exception, SecurityException { //
Student s = new Student();
Class<Student> c = Student.class; // 获得age变量 并赋值
Field f = c.getDeclaredField("age"); f.setAccessible(true); f.set(s, ); System.out.println(s.getAge()); int a = (int)f.get(s);
System.out.println(a);
}
}
- 反射调用成员方法
- 获得方法
- Method t = c.getMethod(方法名,参数类型列表);
- 使得私有方法允许被调用
- t.setAccessible(true);
- 调用方法
- t.invoke(对象,参数数据);
- 让指定对象,执行该方法
- 静态方法,第一个参数传 null
- 没有返回值得到 null
package day1901_反射; import java.lang.reflect.Field;
import java.lang.reflect.Method; import day0802.Student; /*
* 跨项目不能直接访问,需要项目关联
* 左侧选中需要关联项目的项目,右键弹出选中build path 选中项目project,
*/
public class Test3 {
public static void main(String[] args) throws Exception, SecurityException { //
Student s = new Student();
Class<Student> c = Student.class; // 获得age变量 并赋值
Field f = c.getDeclaredField("age"); f.setAccessible(true); f.set(s, ); System.out.println(s.getAge()); int a = (int)f.get(s);
System.out.println(a); // 反射测试方法
Method gg = c.getMethod("getGender"); Method sg = c.getMethod("setGender", String.class); sg.invoke(s, "男");
Object r = gg.invoke(s); System.out.println(r); }
}- 反射的测试应用
package day1901_反射; import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.util.ArrayList; public class Runner { private static ArrayList<String> list =
new ArrayList<String>(); // 静态初始化快
static {
try { BufferedReader buf =
new BufferedReader(
new InputStreamReader(
new FileInputStream(
"/Users/dingzhijie/Desktop/file3.txt"),
"UTF-8")); String line;
while ((line = buf.readLine()) != null) {
line = line.replace("\\s+", "");
if (line.length()==) {
continue;
}
list.add(line);
}
buf.close(); } catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e);
}
} public static void launch() {
try {
for (String s : list) {
// 拆分字符串
String[] a = s.split(";");
// 获得类名
Class<?> c = Class.forName(a[]);
Object obj = c.newInstance(); // 获得方法名
Method m = c.getMethod(a[]); m.invoke(obj);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("执行失败");
e.printStackTrace();
}
} public static void main(String[] args) {
System.out.println("main");
for (String string : list) {
System.out.println(string);
} System.out.println("--------------");
Runner.launch();
}
}
- 反射是框架的底层实现原理
- SSM
- 注解
- 为其他开发工具,或其他 Java 程序,提供额外的信息
- @Override
- public String toString(){ }
- @Override 由编译器处理,编译器识别改注解,来对方法重新进行语法检查
- 自定义注解
- 要自己编写处理代码
package day1902_注解; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.METHOD) // 单个
//@Target({ElementType.METHOD,ElementType.FIELD}) // 多个 @Retention(RetentionPolicy.RUNTIME) /*
* 元注解
*
* @Target
* 设置注解目标: 类, 方法,成员变量, 参数...
*
* @Retention
* 保留范围:
* 源码文件 - 编译时注解信息被丢弃 - 编译器处理
* 字节码 - 类被加载到内存是丢弃 - 类加载器处理
* 运行期内存 - 在内存中存在,不会被丢弃 - 自定义注解使用
*
*/ //定义注解 @interface
public @interface Test { // 注解的属性
// 如果不指定默认值, 使用时必须赋值 // int id();
int id() default ; // 特殊的属性名, 有特殊待遇
// 如果单独赋值, 可以不写属性名
String value() default ""; }
- Junit 单元测试框架
- Junit 第三方开源工具
- Junit 是 Java 单元测试的事实标准
- eclipse 集成了Junit, 可以直接在项目中引入 Junit jar 包
- 还集成了 Junit 的运行器
package day1903_Junit; import org.junit.Test; /*
* 引入Junit 开发包
* 右键点击项目 Build path - library -
* add Library - Junit - Junit 4
*
*
* 直接运行即可测试
* 光标定位在测试方法上, 可以只执行单个测试方法
* 定位在类上是测试单个类的代码
*
*/
public class Test1 { @Test
public void a(){
System.out.println("测试a");
} public void b(){
System.out.println("测试b");
}
@Test
public void c(){
System.out.println("测试c");
} @Test
public void d(){
System.out.println("测试d");
}
}
- 网络爬虫
- 抓取网页页面内容
- 常用的网络爬虫工具
- HttpClient
- Jsoup
- Jsoup
- 第三方的开源 API
- 需要到官网下载 Jsoup jar 文件
- 参考官方的使用文档, 示例代码
package day1904_网络爬虫; import java.io.IOException; import org.jsoup.Jsoup;
import org.junit.Test; /*
* 引入 Jsoup 开发包
* 右键点击项目 - Build path - add External jar 选中所有文件
*/
public class Test1 {
@Test
public void test1() throws Exception {
String s = Jsoup.connect("http://www.baidu.com")
.execute()
.body(); System.out.println(s); } @Test
public void test2() throws Exception {
String s = Jsoup.connect("http://www.jd.com/")
.execute()
.body(); System.out.println(s);
}
}
java - day019 - 反射的更多相关文章
- JAVA的反射理解
1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...
- java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- iOS运行时编程(Runtime Programming)和Java的反射机制对比
运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java:反射
初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射进阶之总结与详解
一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
随机推荐
- Spring AOP无法拦截Controller
参考@参考文章中的评论 首先,应该打开aop代理 <aop:aspectj-autoproxy proxy-target-class="true"/> 其次,应该讲ao ...
- How to Plan and Configure YARN and MapReduce 2 in HDP 2.0
As part of HDP 2.0 Beta, YARN takes the resource management capabilities that were in MapReduce and ...
- Swift4.0复习扩展
1.扩展计算式属性: 2.对方法进行扩展: /// 定义枚举类型Light, /// 它指定了基本类型String enum Light: String { case red = "red& ...
- iOS电商类App研发学习总结
一.涵盖知识点: 1.电商类App架构: https://www.cnblogs.com/loying/p/4801194.html 2.快速搭建电商平台: https://www.jianshu.c ...
- 【Leetcode_easy】867. Transpose Matrix
problem 867. Transpose Matrix solution: class Solution { public: vector<vector<int>> tra ...
- 页面进行ajax时 显示一个中间浮动loading
先发效果图,加载东西的时候如果没有设计或者其它提示会降低用户体验,所以写了个简单的loading弹层. 适用于触屏和pc页面. /* 页面进行ajax时 显示一个中间浮动loading @auther ...
- anywhere随启随用的静态文件服务器
手机移动端调试,也可以使用anywhere anywhere -p 8080 指定端口 anywhere -s 保持浏览器关闭 anywhere -h localhost -p 8080 通过主机名 ...
- CountDownLatch和CyclicBarrier使用上的区别
一.CountDownLatchDemo package com.duchong.concurrent; import java.util.Map; import java.util.concurre ...
- php cli传递参数的方法
php cli传递参数的方法 <pre>$options = "f:g:"; $opts = getopt( $options ); print_r($opts); & ...
- Git操作入门
生成ssh key: ssh-keygen -t rsa -C "lkt@temp.com" 按三次回车,最后在.ssh文件夹下得到id_rsa和id_rsa.pub两个文 ...