자바 언어 기초 - 반사 메커니즘, 정규 표현 식
20241 단어 자바 언어
반사 메커니즘 은 실행 상태 에서 임의의 클래스 에 대해 이 클래스 (class 파일) 의 모든 속성 과 방법 을 알 수 있 습 니 다.임의의 대상 에 대해 서 는 그것 의 임의의 방법 과 속성 을 호출 할 수 있다.이러한 동적 으로 정 보 를 얻 고 대상 을 동적 으로 호출 하 는 방법의 기능 을 자바 언어의 반사 메커니즘 이 라 고 한다.
쉽게 말 하면 동적 획득 류 의 정 보 는 자바 의 반사 체제 이다.유형 에 대한 해부 로 이해 할 수 있다.
Tomcat 은 요청 과 응답 을 처리 하 는 방식 을 제공 합 니 다.구체 적 인 처리 동작 이 다 르 기 때문에 대외 적 으로 인 터 페 이 스 를 제공 하고 개발 자가 구체 적 인 요청 과 응답 처 리 를 실현 합 니 다.
Class 클래스 는 바이트 파일 의 모든 내용 을 가 져 올 수 있 습 니 다. 반 사 는 이 클래스 에 의 해 이 루어 집 니 다.클래스 파일 을 해부 하려 면 이러한 바이트 파일 만 가 져 오 면 됩 니 다.
클래스 의 바이트 파일 가 져 오기:
package cn.itcast.reflect.demo;
import cn.itcast.bean.Person;
/*
* ,
*/
public class ReflectDemo {
/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
// getClassObject_1();
// getClassObject_2();
getClassObject_3();
}
/*
* :( )
* , , 。
* Class 。
* forName。
* , , 。
*/
public static void getClassObject_3() throws ClassNotFoundException {
String className="cn.itcast.bean.Person";
Class clazz=Class.forName(className);
System.out.println(clazz);
}
/*
* :
* .class Class 。
* 。
* , 。
*
*/
public static void getClassObject_2() {
Class clazz=Person.class;
Class clazz1=Person.class;
System.out.println(clazz==clazz1);
}
/*
* :
* :
* Object getClass
* , , 。
*/
public static void getClassObject_1(){
Person p=new Person();
Class clazz=p.getClass();
Person p1=new Person();
Class clazz1=p1.getClass();
System.out.println(clazz==clazz1);
}
}
Class 의 구조 함수 가 져 오기:
package cn.itcast.reflect.demo;
import java.lang.reflect.Constructor;
public class ReflectDemo2 {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// createNewObject();
createNewObject_2();
}
public static void createNewObject_2() throws Exception {
// cn.itcast.bean.Person p = new cn.itcast.bean.Person(" ",39);
/*
* ,
*
* ,
* 。
*
* :getConstructor(parameterTypes)
*/
String name = "cn.itcast.bean.Person";
Class clazz = Class.forName(name);
//
Constructor constructor=clazz.getConstructor(String.class,int.class);
// newInstance
Object obj=constructor.newInstance(" ",38);
}
public static void createNewObject() throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
// :new , new , , , Person
cn.itcast.bean.Person p = new cn.itcast.bean.Person();
// :
String name = "cn.itcast.bean.Person";
// , , Class
Class clazz = Class.forName(name);
//
Object obj = clazz.newInstance();//
}
}
Class 의 필드 예제 가 져 오기: Public class AccessibleObjectextends Object implements Annotated Element AccessibleObject 류 는 Field, Method, Constructor 대상 의 기본 클래스 입 니 다.반 사 된 대상 을 사용 할 때 기본 자바 언어 접근 제어 검 사 를 취소 하 는 능력 으로 표시 합 니 다.
package cn.itcast.reflect.demo;
import java.lang.reflect.Field;
public class ReflectDemo3 {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
getFieldDemo();
}
/*
*
*/
public static void getFieldDemo() throws Exception {
Class clazz = Class.forName("cn.itcast.bean.Person");
// Field field=clazz.getField("age");// public
Field field=clazz.getDeclaredField("age");// ( )
// ,
field.setAccessible(true);
Object obj=clazz.newInstance();
field.set(obj, 90);
Object o=field.get(obj);
System.out.println(o);
}
}
Class 에서 가 져 오 는 방법:
package cn.itcast.reflect.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import cn.itcast.bean.Person;
public class ReflectDemo4 {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// getMethodDemo();
// getMethodDemo_2();
getMethodDemo_3();
}
public static void getMethodDemo_3() throws Exception {
Class clazz = Class.forName("cn.itcast.bean.Person");
Method method = clazz.getMethod("paramMethod", String.class, int.class);
Object obj = clazz.newInstance();
method.invoke(obj, " ", 39);
}
public static void getMethodDemo_2() throws Exception {
Class clazz = Class.forName("cn.itcast.bean.Person");
Method method = clazz.getMethod("show", null);//
// Person p=new Person();
// p.show();
// Object obj=clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance(" ", 37);
method.invoke(obj, null);
}
/*
* Class
*/
public static void getMethodDemo() throws Exception {
Class clazz = Class.forName("cn.itcast.bean.Person");
Method[] methods = clazz.getMethods();//
methods = clazz.getDeclaredMethods();// ( )
for (Method method : methods) {
System.out.println(method);
}
}
}
package cn.itcast.bean;
public class Person {
private int age;
private String name;
public Person(String name, int age ) {
super();
this.age = age;
this.name = name;
System.out.println("person param run..."+this.name+":"+this.age);
}
public Person() {
super();
System.out.println("person run");
}
public void show(){
System.out.println(name+"...show run..."+age);
}
private void privateMethod(){
System.out.println("private method run");
}
public void paramMethod(String str,int num){
System.out.println("paramMethod run......"+str+":"+num);
}
public static void staticMethod(){
System.out.println("staticMethod run");
}
}
반사 연습:
package cn.itcast.reflect.test;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
/*
*
*/
public class ReflectTest {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
MainBoard mb=new MainBoard();
mb.run();
// ,
// mb.usePCI(new SoundCard());// SoundCard,
// ,
// new, class ,
File configFile=new File("pci.properties");
Properties prop=new Properties();
FileInputStream fis=new FileInputStream(configFile);
prop.load(fis);
for(int x=0;x<prop.size();x++){
String pciName=prop.getProperty("pci"+(x+1));
Class clazz=Class.forName(pciName);// Class pci
PCI p=(PCI) clazz.newInstance();// PCI , PCI
mb.usePCI(p);
}
fis.close();
}
}
package cn.itcast.reflect.test;
public class MainBoard {
public void run() {
System.out.println("main board run");
}
public void usePCI(PCI p) {// ,
if (p != null) {
p.open();
p.close();
}
}
}
package cn.itcast.reflect.test;
public interface PCI {
public void open();
public void close();
}
package cn.itcast.reflect.test;
public class SoundCard implements PCI{
public void open(){
System.out.println("sound open");
}
public void close(){
System.out.println("sound close");
}
}
package cn.itcast.reflect.test;
public class NetCard implements PCI{
@Override
public void open() {
System.out.println("net open");
}
@Override
public void close() {
System.out.println("net close");
}
}
pci.properties
pci1=cn.itcast.reflect.test.SoundCard
pci2=cn.itcast.reflect.test.NetCard
정규 표현 식 정규 표현 식 은 문자열 데 이 터 를 조작 하 는 데 사 용 됩 니 다.특정한 기 호 를 통 해 표현 한다.정규 표현 식 은 쓰 기 를 간소화 하 였 으 나 읽 기 는 나 빠 졌 다.
package cn.itcast.regex.demo;
public class RegexDemo {
/**
* @param args
*/
public static void main(String[] args) {
String qq = "123456789";
// checkQQ(qq);
String regex = "[1-9][0-9]{4,14}";//
// String regex="[1-9]\\d{4,14}";//
// boolean b=qq.matches(regex);
// System.out.println(qq+":"+b);
String str = "aoob";
String reg = "ao+b";// o
boolean b = str.matches(reg);
System.out.println(b);
}
/*
* : QQ
* : 5-15 ; ;0
*/
public static void checkQQ(String qq) {
int len = qq.length();
if (len >= 5 && len <= 15) {
if (!qq.startsWith("0")) {
try {
long l = Long.parseLong(qq);
System.out.println(qq + " ");
} catch (NumberFormatException e) {
System.out.println(qq + " ");
}
} else {
System.out.println(qq + " 0 ");
}
} else {
System.out.println(" ");
}
}
}
정규 표현 식 은 문자열 의 일반적인 작업 그룹 과 캡 처 캡 처 그룹 에 대해 왼쪽 에서 오른쪽으로 괄호 를 계산 하여 번 호 를 매 길 수 있 습 니 다.예 를 들 어 표현 식 (A) (B (C))) 에 다음 과 같은 그룹 이 네 개 있 습 니 다.
1 ((A)(B(C))) 2 \A 3 (B(C)) 4 (C)
그룹 0 은 항상 전체 표현 식 을 대표 합 니 다.
캡 처 그룹 이 라 고 명명 한 이 유 는 일치 하 는 그룹 과 일치 하 는 입력 시퀀스 의 모든 하위 시퀀스 를 저장 하기 때 문 입 니 다.캡 처 된 하위 시퀀스 는 나중에 Back 참조 로 표현 식 에서 사용 할 수 있 으 며, 일치 하 는 작업 이 끝 난 후에 일치 하 는 장치 에서 가 져 올 수 있 습 니 다.
그룹 과 연 결 된 캡 처 입력 은 항상 그룹 과 최근 에 일치 하 는 하위 시퀀스 입 니 다.양 적 인 이유 로 그룹 을 다시 계산 하면 두 번 째 계산 이 실 패 했 을 때 이전에 캡 처 한 값 (있 으 면) 을 유지 합 니 다. 예 를 들 어 문자열 'aba' 를 표현 식 (a (b)?) + 와 일치 시 키 면 두 번 째 그룹 을 'b' 로 설정 합 니 다.일치 하 는 시작 마다 캡 처 된 입력 이 버 려 집 니 다.
(?) 로 시작 하 는 그룹 은 순수한 비 포획 그룹 으로 텍스트 를 포획 하지 않 고 조합 계 에 대해 계산 하지 않 습 니 다.
public final class Patternextends Object implements Serializable 정규 표현 식 의 컴 파일 표시 형식 입 니 다.문자열 로 지정 한 정규 표현 식 은 먼저 이러한 인 스 턴 스 로 컴 파일 되 어야 합 니 다 (정규 표현 식 을 대상 으로 밀봉 합 니 다).그리고 얻 은 모드 를 Matcher (일치) 대상 을 만 드 는 데 사용 할 수 있 습 니 다. 정규 표현 식 에 따라 이 대상 은 임의의 문자 시퀀스 와 일치 할 수 있 습 니 다.일치 하 는 모든 상 태 를 일치 기 에 저장 하기 때문에 여러 일치 기 는 같은 모드 를 공유 할 수 있 습 니 다.따라서 전형 적 인 호출 순 서 는 Pattern p = Pattern. copile ('a * b') 이다.Matcher m = p.matcher("aaaaab"); boolean b = m.matches();
package cn.itcast.regex.demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
/*
*
* 1.
* String matchs ;
*
* 2.
* String split ;
*
* 3.
* String replaceAll ;
*
* 4.
* ;
* Pattern p = Pattern.compile("a*b");
* matcher , Matcher
* Matcher m = p.matcher("aaaaab");
* Matcher
* boolean b = m.matches();
*/
// functionDemo1();
// functionDemo2();
// functionDemo3();
functionDemo4();
}
/*
*
*/
public static void functionDemo4() {
String str = "da jia hao,ming tian bu fang jia!";
String regex = "\\b[a-z]{3}\\b";// \\b- , jia hao min
// 1.
Pattern p = Pattern.compile(regex);
// 2.
Matcher m = p.matcher(str);
// Matcher
//
// find()
System.out.println(str);
while (m.find()) {
System.out.println(m.group());//
System.out.println(m.start()+":"+m.end());//
}
}
/*
*
*/
public static void functionDemo3() {
String str = "zhangsantttxiaoqiangmmmmmzhaoliu";
// str=str.replaceAll("(.)\\1+", "#");// #
str = str.replaceAll("(.)\\1+", "$1");// ;$1,
System.out.println(str);
String tel = "15812345678";// 158****5678
tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(tel);
}
/*
*
*/
public static void functionDemo2() {
// String str="zhangsan xiaoqiang zhaoliu";
// String[] names=str.split(" +");//
// String str="zhangsan.xiaoqiang.zhaoliu";
// String[] names=str.split("\\.");
String str = "zhangsantttxiaoqiangmmmmmzhaoliu";// ttt,mmmmm
// (X) X, ;
nth
// ((A) (B(C)) , , ; , 0
String[] names = str.split("(.)\\1+");// ,
for (String name : names) {
System.out.println(name);
}
}
/*
*
*/
public static void functionDemo1() {
//
String tel = "15800001111";
// String regex="1[358][0-9]{9}";
String regex = "1[358]\\d{9}";
boolean b = tel.matches(regex);
System.out.println(tel + ":" + b);
}
}
정규 표현 식 - 연습:
package cn.itcast.regex.test;
import java.util.TreeSet;
public class RegexTest {
/**
* @param args
*/
public static void main(String[] args) {
/*
* 1. : ... ... .. ... ... ... ...
* 2. ip
* 3.
*/
// test_1();
// test_2();
test_3();
}
/*
*
*/
public static void test_3() {
String mail="[email protected]";
String regex="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{2,3})+";//(\\.[a-zA-Z]{2,3})+, .com,.cn ,
regex="\\w+@a\\w+(\\.\\w+)+";//
boolean b=mail.matches(regex);
System.out.println(mail+":"+b);
}
/*
* ip
* 192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55
*/
public static void test_2() {
String ip_str="192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";
//1. ip , ip ,
// 0 ; 2 0;
ip_str=ip_str.replaceAll("(\\d+)", "00$1");
// System.out.println(ip_str);//00192.00168.0010.0034 00127.000.000.001 003.003.003.003 00105.0070.0011.0055
//2.
ip_str=ip_str.replaceAll("0*(\\d{3})", "$1");
// System.out.println(ip_str);//192.168.010.034 127.000.000.001 003.003.003.003 105.070.011.055
// ip
String[] ips=ip_str.split(" +");
TreeSet<String> ts=new TreeSet<String>();
for(String ip:ips){
ts.add(ip);
}
for(String ip:ts){
System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
}
}
/*
*
*/
public static void test_1(){
String str=" ... ... .. ... ... ... ... ";
//1. “.” ,
str=str.replaceAll("\\.+", "");
//2.
str=str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
}
정규 표현 식 - 연습 - 파충류
package cn.itcast.regex.test;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* :
*
*
*/
public class RegexTest2 {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// List<String> list=getMail();
List<String> list = getMailByWeb();
for (String mail : list) {
System.out.println(mail);
}
}
public static List<String> getMailByWeb() throws IOException {
// 1.
URL url=new URL("http://iask.sina.com.cn/b/1005465.html");
BufferedReader bufIn=new BufferedReader(new InputStreamReader(url.openStream()));
// 2. ,
String mail_regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while ((line = bufIn.readLine()) != null) {
Matcher m = p.matcher(line);
while (m.find()) {
// 3.
list.add(m.group());
}
}
bufIn.close();
return list;
}
public static List<String> getMail() throws IOException {
// 1.
BufferedReader bufr = new BufferedReader(
new FileReader("c:\\mail.html"));
// 2. ,
String mail_regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while ((line = bufr.readLine()) != null) {
Matcher m = p.matcher(line);
while (m.find()) {
// 3.
list.add(m.group());
}
}
bufr.close();
return list;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정규 표현 식 과 이상 처리프로그램 이 실행 되 기 시 작 했 고 이상 이 발생 한 후에 우 리 는 이상 한 유형, 이상 이 발생 한 줄 번 호 를 주목 해 야 합 니 다.오 류 는 프로그램 이 실행 되 는 과정 에서 발생 하 는 일련의 이상...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.