1,反射
有对象
没有,但是知道内部结构
定位
/**
* 反射:吧java中的各种而机构(方法,属性,构造器,类名)映射成一个个的java对象
* 1,获取Class对象
* 三种方式:Class.forName
* 2,可以动态创建
*/
public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//三种方式
//1,对象.getClass
Iphone iphone=new Iphone();
Class clz=iphone.getClass();
//2,类.class
clz=Iphone.class;
//3,定位Class.forNmae("报名.类名")
clz=Class.forName("base.Iphone");
//创建对象
Iphone iphone2=(Iphone)clz.newInstance();
System.out.println(iphone2);
//jdk9的创建方式
Iphone iphone3=(Iphone)clz.getConstructor().newInstance();
System.out.println(iphone3);
}
}
class Iphone{
public Iphone() {
}
}
XML:可扩展标记语言,作为数据的一种存储格式或用于存储软件的参数,程序解析此配置文件,达到不修改代码,修改程序的目的。
/**
* 熟悉Sax解析流程l
*/
public class XmlTest02 {
public static void main(String[] args) throws Exception {
//实例化工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//2,从解析工厂获取解析器
SAXParser parse=factory.newSAXParser();
//3,编写处理器
//加载文档Document注册处理器
Webhandler phandler=new Webhandler();
parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("servlet/web.xml"),phandler);
List<Entity> persons=phandler.getEntitys();
for(Entity p:persons){
System.out.println(p.getName()+" "+p.getClz());
}
List<Mapping> mappings=phandler.getMappings();
for(Mapping p:mappings){
System.out.println(p.getName()+" "+p.getPattrens().toString());
}
WebContext webContext=new WebContext(persons,mappings);
//输入 /login
String className=webContext.getClz("/reg");
Class clz=Class.forName(className);
// Servlet servlet=(Servlet)clz.newInstance();
Servlet servlet=(Servlet)clz.getConstructor().newInstance();
System.out.println(servlet);
servlet.service();
}
}
class Webhandler extends DefaultHandler{
private List<Entity> entitys;
private List<Mapping> mappings;
private Entity entity;
private Mapping mapping;
private String tag;//存储操作标签
private boolean isMpping=false;//存储操作标签
@Override
public void startDocument() throws SAXException {
entitys=new ArrayList<>();
mappings=new ArrayList<>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println(qName+"---->解析开始");
if(null!=qName){
tag=qName;
if(tag.equals("servlet")){
entity=new Entity();
isMpping=false;
}else if(tag.equals("servlet-mapping")){
mapping=new Mapping();
isMpping=true;
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println(qName+"---->解析结束");
if(qName.equals("servlet")){
entitys.add(entity);
}else if(qName.equals("servlet-mapping")){
mappings.add(mapping);
}
tag=null;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String contents=new String(ch,start,length).trim();
if(null!=tag){
if(isMpping){//c操作mapping
if(tag.equals("servlet-name")){
mapping.setName(contents);
}else if(tag.equals("url-pattren")){
mapping.addPatterns(contents);
}
}else{
if(tag.equals("servlet-name")){
entity.setName(contents);
}else if(tag.equals("servlet-class")){
entity.setClz(contents);
}
}
}
}
@Override
public void endDocument() throws SAXException {
System.out.println("解析文档结束");
}
public List<Entity> getEntitys() {
return entitys;
}
public List<Mapping> getMappings() {
return mappings;
}
}
xml解析:
XmlTest02:解析类:
/**
* 熟悉Sax解析流程l
*/
public class XmlTest02 {
public static void main(String[] args) throws Exception {
//实例化工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//2,从解析工厂获取解析器
SAXParser parse=factory.newSAXParser();
//3,编写处理器
//加载文档Document注册处理器
Webhandler phandler=new Webhandler();
parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("servlet/web.xml"),phandler);
List<Entity> persons=phandler.getEntitys();
for(Entity p:persons){
System.out.println(p.getName()+" "+p.getClz());
}
List<Mapping> mappings=phandler.getMappings();
for(Mapping p:mappings){
System.out.println(p.getName()+" "+p.getPattrens().toString());
}
WebContext webContext=new WebContext(persons,mappings);
//输入 /login
String className=webContext.getClz("/reg");
Class clz=Class.forName(className);
// Servlet servlet=(Servlet)clz.newInstance();
Servlet servlet=(Servlet)clz.getConstructor().newInstance();
System.out.println(servlet);
servlet.service();
}
}
class Webhandler extends DefaultHandler{
private List<Entity> entitys;
private List<Mapping> mappings;
private Entity entity;
private Mapping mapping;
private String tag;//存储操作标签
private boolean isMpping=false;//存储操作标签
@Override
public void startDocument() throws SAXException {
entitys=new ArrayList<>();
mappings=new ArrayList<>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println(qName+"---->解析开始");
if(null!=qName){
tag=qName;
if(tag.equals("servlet")){
entity=new Entity();
isMpping=false;
}else if(tag.equals("servlet-mapping")){
mapping=new Mapping();
isMpping=true;
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println(qName+"---->解析结束");
if(qName.equals("servlet")){
entitys.add(entity);
}else if(qName.equals("servlet-mapping")){
mappings.add(mapping);
}
tag=null;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String contents=new String(ch,start,length).trim();
if(null!=tag){
if(isMpping){//c操作mapping
if(tag.equals("servlet-name")){
mapping.setName(contents);
}else if(tag.equals("url-pattren")){
mapping.addPatterns(contents);
}
}else{
if(tag.equals("servlet-name")){
entity.setName(contents);
}else if(tag.equals("servlet-class")){
entity.setClz(contents);
}
}
}
}
@Override
public void endDocument() throws SAXException {
System.out.println("解析文档结束");
}
public List<Entity> getEntitys() {
return entitys;
}
public List<Mapping> getMappings() {
return mappings;
}
}
Mapping:selvlet-mapping解析类:
public class Mapping {
private String name;
private Set<String> pattrens;
public Mapping() {
pattrens=new HashSet<>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<String> getPattrens() {
return pattrens;
}
public void setPattrens(Set<String> pattrens) {
this.pattrens = pattrens;
}
public void addPatterns(String pattren){
this.pattrens.add(pattren);
}
}
servlet:解析类:
public class Entity {
private String name;
private String Clz;
public Entity() {
}
public Entity(String name, String clz) {
this.name = name;
Clz = clz;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClz() {
return Clz;
}
public void setClz(String clz) {
Clz = clz;
}
}
public interface Servlet {
void service();
}
public class LoginServlet implements Servlet {
@Override
public void service() {
System.out.println("LoginServlet");
}
}
xml文档:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>servlet.LoginServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>reg</servlet-name>
<servlet-class>servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattren>/login</url-pattren>
<url-pattren>/g</url-pattren>
</servlet-mapping>
<servlet-mapping>
<servlet-name>reg</servlet-name>
<url-pattren>/reg</url-pattren>
<url-pattren>/g</url-pattren>
</servlet-mapping>
</web-app>